【问题标题】:T-SQL Two Where Clauses on same column同一列上的 T-SQL 两个 Where 子句
【发布时间】:2011-05-21 21:56:04
【问题描述】:

在 SQL Server 2008 中,我有以下表格示例。

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

非常感谢。

【问题讨论】:

    标签: sql-server tsql where-clause


    【解决方案1】:

    你想要这样的东西:

    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
    

    但是还有其他方法可以为“具有以下所有属性的项目集”猫蒙皮。

    【讨论】:

    【解决方案2】:

    其中任何一个都会产生您想要的输出:

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

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

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

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

    可能有更好的解决方案。很抱歉造成误会。

    【讨论】:

    • 他要求的名称至少有一行 10,至少一行 20。
    • 编辑后的版本仍将显示 Peter 30,这不是 OP 想要的。
    • 您当前的解决方案为 Peter 和 Mike 返回 Num 不是 10 或 20 的行。
    • 是的,Cade Roux 提到了这一点,我赞成他的回答。我相信他的做法是正确的。
    【解决方案3】:

    你可以试试这个

    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)
            )
    

    【讨论】:

    • 需要注意,由于使用 来查找“其他”条目,因此这不会扩展到列表中的三个项目的情况。 2项以上的情况,会有假的“other”。
    【解决方案4】:

    试试这个

    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       
    

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 2012-04-11
      • 2019-11-16
      相关资源
      最近更新 更多