2010-12-07 31 views
3

Dans SQL Server 2008, j'ai ci-dessous Table Sample.T-SQL Deux où des clauses sur la même colonne

Name Num 
---------- 
John 20 
John 30 
Peter 10 
Peter 20 
Peter 30 
Marry 20 
Marry 30 
Mike 10 
Mike 20 
Mike 30 
Phil 10 
Phil 30 

Je veux des documents ayant Num = 10 et Num = 20. La requête retournera

Name Num 
---------- 
Peter 10 
Peter 20 
Mike 10 
Mike 20 

Un grand merci.

Répondre

6

Vous voulez quelque chose comme ceci:

SELECT Name, Num 
FROM tbl 
WHERE Name IN (
    SELECT Name FROM tbl 
    WHERE Num IN (10, 20) 
    GROUP BY Name 
    HAVING COUNT(*) = 2 -- Must have all items in the set of 2 
) 
AND Num IN (10, 20) -- still need to restrict, since the set is not maximal 

Mais il y a d'autres façons de la peau « l'ensemble des éléments avec tous les attributs suivants » cat.

+1

+1 @ user219628 quelques autres options ici http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/ –

+0

@Martin - That est un excellent article. Merci de l'avoir relié. –

1

Chacune de ces produira la sortie que vous voulez:

SELECT * FROM Sample WHERE Num IN (10, 20) 

ou

SELECT * FROM Sample WHERE Num = 10 OR Num = 20 

EDIT: Désolé, cela semble que c'est pas vraiment ce que tu voulais. Je crois que cela fonctionnera, mais ce n'est pas très élégant:

SELECT * FROM Sample 
WHERE Name IN (SELECT Name FROM Sample WHERE Num = 10) 
    AND Name IN (SELECT Name FROM Sample WHERE Num = 20) 

Il y a probablement une meilleure solution. Désolé pour le malentendu.

+0

Il demande des noms qui ont au moins une ligne avec 10, et au moins une ligne avec 20. – bobs

+0

La version modifiée sera toujours montrer Peter 30, ce qui n'est pas ce que le PO voulait. –

+0

Oh oui, bon point. : - \ – Charley

1

Vous pouvez essayer cette

SELECT Name, Num 
FROM MyTableSample s 
WHERE Num in (10, 20) 
    AND EXISTS 
     (
     SELECT Name 
     FROM MyTableSample s2 
     WHERE s.name = s2.Name 
      AND s.Num <> s2.Num 
      AND s2.Num in (10, 20) 
     ) 
+0

Il faut faire attention au fait que ceci ne sera pas mis à l'échelle dans le cas de trois éléments de la liste en raison de l'utilisation de <> pour trouver l'entrée "autre". Dans le cas de plus de 2 items, il y aura de faux "autres". –

-1

Essayez cette

SELECT * 
    FROM (SELECT Name, Num FROM Sample WHERE Num = 10) A, 
        (SELECT Name, Num FROM Sample WHERE Num = 20) B 
where A.nAME = B.nAME