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:

base de dados DB1 Tabela A (unitNo, BuildingNo)

base de dados DB2 Tabela B (unitNo, BuildingNo)

  1. 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.

  2. 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.

  3. 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

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top