2010-02-23 8 views
1

Il est facile de trouver tous les utilisateurs qui ont ids trait.color = « vert » mais je dois trouver tous les gens qui ne le font pas. La façon évidente est une sous-sélection pour tous les ids où existe pas (select id où trait.color = « vert") mais je tentais de penser s'il y a un moyen de le faire sans subselect. Est-il un truc que je ne sais pas?Vous recherchez sql pour trouver une liste de personnes dans une base de données qui n'ont pas une ligne particulière sans utiliser existe pas

sybase 12,5 pas de clé étrangère, mais la table est un à plusieurs. imaginez simple

ID trait 
-- ----- 
1 yellow 
1 green 
1 blue 
2 yellow 
2 blue 
2 black 
3 yellow 
3 green 
3 black 
+0

La base de données (y compris version) et structure de la table serait utile. –

+0

Cela peut aller de plusieurs façons en fonction de vos relations. Pouvez-vous poster des informations PK et FK? –

+0

sybase 12,5 pas de clé étrangère, mais la table est une relation un à plusieurs. Imaginez un simple tableau que je viens d'ajouter à la question. – stu

Répondre

4

NO T EXISTS est plus efficace sur SQL Server ... juste le faire :-)

...MyTable M where not exists (
    select id FROM trait T where T.color = 'green' AND T.key = M.key) 
+0

Je pensais autant. De temps à autre, j'apprends un truc de SQL et je pense qu'il y en a peut-être un pour cette situation. – stu

+0

@stu: NOT EXISTS * est * le truc sql propre .. plus fiable et efficace – gbn

-1

rejoindre sur le UserID où trait.color <> " vert "?

+0

Cela ne fonctionnera pas avec son jeu de données car il y a plusieurs enregistrements avec le même code d'utilisateur. – HLGEM

2

Si la table utilisateur a un à plusieurs avec la table alors le NOT EXISTS caractères est plus probable que votre meilleure réponse.

Vous pouvez également essayer une clause distincte avec une jointure gauche et trait.userid = NULL

SELECT Distinct Users.UserId 
FROM USERS 
    LEFT JOIN (SELECT * FROM Traits Where Color = 'GREEN') GreenTraits 
     ON Users.UserId = GreenTraits.UserId 
WHERE 1=1 
AND GreenTraits.UserId = NULL 
+0

intéressant, mais est essentiellement fonctionnellement équivalent à ne pas existe, non? – stu

+0

@stu: votre question dit "sans utiliser NOT EXISTS". Eh bien, voilà. :) –

+0

touche. stu