Question

J'ai un problème pathologique avec SQL, donc je généralement trier tous mes problèmes de base de données en construisant des applications logicielles quickie pour gérer mes problèmes SQL.

(comme je le fais aussi dans ce cas)

Merci à Stackoverflow je pense que je peux être fait honte dans l'exactitude, donc je voudrais savoir comment faire ce genre de dépannage SQL dans SQL réelle ou T-SQL lui-même (si possible):

Je:

base de données DB1 Tableau A (unitNo, BuildingNo)

base de données DB2 Tableau B (unitNo, BuildingNo)

  1. Je veux venir avec les unités (numéros d'unité) existant sur le tableau A la base de données DB1 qui n'existent pas sur la table B de la base de données DB2 et vice-versa.

  2. Il peut y avoir plus d'une unité avec le même numéro d'unité, cela se produira parce que le même numéro d'unité peut être donnée à des unités de différents bâtiments.

  3. Je n'ai pas accès en écriture à l'une des bases de données.

J'espère que cela ne se voit pas comme un « Donne-moi Teh Codz » post, je voudrais savoir comment les gens avec plus la maîtrise de SQL que moi trier ce genre d'algorithme, les messages à des tutoriels ou des conseils sont plus que bienvenus, pas plein code requis, mais si elle aide à un sens, alors s'il vous plaît faire.

Au début, je pensais que je pouvais obtenir tous les numéros d'unité d'une table et de les exclure sur une sélection de l'autre comme ceci:

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',
[...]

Cela fonctionne habituellement, mais le nombre d'unités d'une table est immense, en essayant cette plante le serveur SQL avec:

  

"a manqué d'espace de pile"

Merci,

Ric

Était-ce utile?

La solution

Je pense que vous êtes à la recherche jointure externe complète. Ce qui vous donne les numéros d'unité que vous avez demandés dans la partie 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

D'autres questions qui pourraient être d'intérêt que je l'ai indiqué ci-dessous.

Cela vous donne les enregistrements A non 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

Et vous inversez juste pour trouver les enregistrements B qui ne sont pas en 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

Autres conseils

Comme JPunyon dit, mais si vous voulez en une seule liste, quelque chose comme:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top