2010-10-13 5 views
4

Compte tenu tableau suivant:peu d'aide avec quelques tsql

rowId AccountId Organization1 Organization2 
----------------------------------------------- 
1  1   20    10 
2  1   10    20 
3  1   40    30 
4  2   15    10 
5  2   20    15 
6  2   10    20 

Comment identifier les enregistrements où Organisation2 n'existe pas Organisation1 pour un compte particulier

par exemple, dans les données ci-dessus mon les résultats seront un seul enregistrement qui sera AccountId 1 parce que la valeur de l'organisation2 row3 n'existe pas dans l'organisation1 pour ce compte particulier.

Répondre

6
SELECT rowId, AccountId, Organization1, Organization2 
FROM yourTable yt 
WHERE NOT EXISTS (SELECT 1 FROM yourTable yt2 WHERE yt.AccountId = yt2.AccountId AND yt.Organization1 = yt2.Organization2) 
+3

+1 'NOT EXISTS' est [la meilleure approche dans SQL Server] (http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/) –

+0

Merde, j'aurais aimé avoir le temps de lire ces liens. Thx ;-) –

+0

Etes-vous sûr que ce n'est pas en arrière? Je crois qu'il retournera toutes les lignes où Organization1 n'est dans aucune valeur d'Organization2 pour le même compte. L'OP voulait le contraire. Cela fonctionne de la même manière dans les exemples de données, mais si vous supprimez la ligne 4 de l'échantillon, l'OP voudra que la ligne 5 soit renvoyée mais votre SQL retournera la ligne 6 à la place. –

0

Utilisez la jointure gauche comme Noel Abrahams présenté.

+0

Je ne pense pas que ce soit tout à fait ce qu'il demande, même si elle donne le bon résultat dans l'exemple. Il veut savoir s'il existe des enregistrements pour un AccountId donné dont la valeur Organization2 n'existe pour * aucune * valeur Organization1 dans cet AccountId. Sauf erreur, bien sûr. – Andrew

+0

Vous avez totalement raison. J'avais en ligne ces valeurs .. et chose à leur sujet comme égal ou à mi-temps le poste a été édité. Thaks. –

0
SELECT 
    * 
FROM 
    [YorTable] 
WHERE 
    [Organization1] <> [Organization2] -- The '<>' is read "Does Not Equal". 
1

Voici une façon dont vous pouvez le faire:

données Test:

CREATE TABLE #T(rowid int, acc int, org1 int, org2 int) 

INSERT #T 
SELECT 1,1,10,10 UNION 
SELECT 2,1,20,20 UNION 
SELECT 3,1,40,30 UNION 
SELECT 4,2,10,10 UNION 
SELECT 5,2,15,15 UNION 
SELECT 6,2,20,20 

Effectuez ensuite une auto-jointure à découvrir org2 manquantes:

SELECT 
* 
FROM #T T1 
LEFT JOIN 
    #T T2 
ON t1.org1 = t2.org2 
AND t1.acc = t2.acc 

WHERE t2.org1 IS NULL 
3

Il y a deux interprétations possibles de votre question. La première (où les colonnes Organisation1 et Organisation2 ne sont pas égaux) est trivial:

SELECT AccountID FROM Table WHERE Organization1 <> Organization2 

Mais je soupçonne que vous demandez l'interprétation un peu plus difficile (où Organisation2 ne figure dans aucune valeur Organisation1 pour le même compte) :

SELECT AccountID From Table T1 WHERE Organization2 NOT IN 
    (SELECT Organization1 FROM Table T2 WHERE T2.AccountID = T1.AccountID) 
+2

+1 pour l'interprétation non-triviale. –