Como posso lidar com comparações longos em SQL
-
05-09-2019 - |
Pergunta
Eu tenho um problema patológico com SQL, então eu geralmente tipo todos os meus problemas de banco de dados através da construção de aplicações de software rapidinha para lidar com os meus problemas SQL.
(como eu também estou fazendo neste caso)
Graças à StackOverflow eu acho que pode ser envergonhado em correção, então eu gostaria de aprender a fazer este tipo de solução de problemas SQL em SQL real ou a própria T-SQL (se possível):
Eu tenho:
-
Eu quero vir para cima com as unidades (números de unidade) existentes na Tabela à partir de banco de dados DB1, que não existem na tabela B a partir de banco de dados DB2 e vice-versa.
-
Não pode haver mais de uma unidade com o mesmo número da unidade, isso vai acontecer porque o mesmo número da unidade podem ser dadas às unidades de edifícios diferentes.
-
Eu não tenho acesso de gravação para qualquer um dos bancos de dados.
Espero que isso não é visto como um "Gimme teh codz" post, eu gostaria de saber como as pessoas com mais fluência SQL que eu tipo este tipo de algoritmo, mensagens para tutoriais ou dicas são mais do que bem-vindas, não completa código necessário, mas se ele ajuda a faz sentido, então por favor.
No começo eu pensei que eu poderia apenas obter todos os números da unidade de uma tabela e excluí-los em uma escolha do outro assim:
select concated.unit from
( SELECT ( unitNo + ',' + CONVERT(varchar(12), BuildingNo) ) as unit
FROM A) concated
having concated.unit not in
(
'201,1',
'202,1',
'203,1',
'204,1',
'205,1',
'206,1',
[...]
Este seria normalmente trabalho, mas o número de unidades a partir de qualquer uma tabela é imensa, tentar este trava o servidor SQL com:
"correu para fora do espaço de pilha"
Obrigado,
Ric
Solução
Eu acho que você está procurando completo junção externa. Que lhe dá os números da unidade que você pediu na Parte 1.
Select
A.UnitNumber, B.UnitNumber
from
DB1.dbo.TableA A FULL OUTER JOIN DB2.dbo.TableB B
on A.UnitNumber = B.UnitNumber
and A.BuildingNumber = B.BuildingNumber
Where
A.UnitNumber is null or B.UnitNumber is null
Outras pesquisas que possam ser de interesse eu esbocei abaixo.
Isto dá-lhe os registros em um não em B.
Select
A.UnitNumber
From
DB1.dbo.TableA A Left Join DB2.dbo.TableB B
on A.UnitNumber = B.UnitNumber
and A.BuildingNumber = B.BuildingNumber
Where
B.UnitNumber is null
E você só revertê-la para encontrar os registros em B que não estão em A.
Select
B.UnitNumber
From
DB2.dbo.TableB B left join DB1.dbo.TableA A
on B.UnitNumber = A.UnitNumber
and B.BuildingNumber = A.BuildingNumber
Where
A.UnitNumber is null
Outras dicas
Como JPunyon disse, mas se você quiser-los todos em uma única lista, em seguida, algo como:
Select
[UnitNumber] = COALESCE(A.UnitNumber, B.UnitNumber),
[Source] = CASE WHEN A.UnitNumber IS NOT NULL THEN 'A' ELSE 'B' END
from
DB1.dbo.TableA A
FULL OUTER JOIN DB2.dbo.TableB B
on A.UnitNumber = B.UnitNumber
Where
A.UnitNumber is null or B.UnitNumber is null
ORDER BY COALESCE(A.UnitNumber, B.UnitNumber)