Sql server T-SQL同一列上的两个Where子句
在SQLServer2008中,我有下表示例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
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