Sql server T-SQL同一列上的两个Where子句

Sql server T-SQL同一列上的两个Where子句,sql-server,tsql,where-clause,Sql Server,Tsql,Where Clause,在SQLServer2008中,我有下表示例 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 我想要Num=10和Num=20的记录。查询将返回 Name Num ---------- Peter 10 Peter 20 Mi

在SQLServer2008中,我有下表示例

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
我想要Num=10和Num=20的记录。查询将返回

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

非常感谢。

这两个选项中的任何一个都将产生您想要的输出:

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

编辑:对不起,这似乎不是你真正想要的。我相信这会起作用,但它不是很优雅:

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

也许有更好的解决办法。抱歉误解了。

您想要这样的东西:

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
但是,还有其他方法可以对具有以下所有属性的项集进行蒙皮。

您可以尝试此方法

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)
        )
试试这个

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       

他要求的名字至少有一行有10,至少有一行有20。编辑后的版本仍将显示Peter 30,这不是OP想要的。您当前的解决方案返回Peter和Mike的行,其中Num不是10或20。是的,Cade Roux提到了这一点,我对他的答案投了赞成票。我相信他的方法是正确的。+1@user219628@Martin-这是一篇优秀的文章。感谢您链接它。需要注意的是,由于使用查找其他条目,这不会扩展到列表中三项的情况。如果超过2个项目,则会出现虚假的其他项目。
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