【问题标题】:Using Multiple Row Criteria In the Where Clause在 Where 子句中使用多行条件
【发布时间】:2012-09-19 02:58:08
【问题描述】:

我正在尝试制定一个查询,如果其中一行满足特定条件,我将允许我返回具有相同 ID 号的所有行。我当前的表和想要的表如下:

当前表:

ID  Parameter
1   x
1   x
1   y
1   x
2   x
2   x
2   x
3   y
3   y
3   x
4   x
4   x
4   x

期望的结果:

ID  Parameter
1   x
1   x
1   y
1   x
3   y
3   y
3   x

在这个例子中,我感兴趣的参数是“y”。由于 y 至少出现在 ID 1 和 3 的行中,因此 ID 1 和 3 的所有行数据都被选中,而其余的被过滤掉。有没有办法在 where 子句中写这个,还是我需要考虑另一种方法?

谢谢!

【问题讨论】:

    标签: sql-server-2008 tsql


    【解决方案1】:

    试试这个;它将选择任何 ID 至少有一条记录为Parameter = 'Y' 的所有记录:

    SELECT [ID], [Parameter]
    FROM YourCurrentTable
    WHERE [ID] IN (
        SELECT [ID]
        FROM YourCurrentTable
        WHERE [Parameter] = 'Y'
    )
    

    【讨论】:

      【解决方案2】:

      出于性能目的,您应该更喜欢使用 EXISTS 而不是 IN。 请参阅此线程以了解 EXISTS 和 IN 的差异:SQL Server IN vs. EXISTS Performance

      select id, parameter
      from current_table c1
      where exists (
          select 1
          from current_table c2
          where c2.id = c1.id
          parameter = 'y'
      );
      

      【讨论】:

        【解决方案3】:

        这是您可以做到这一点的一种方法

            create table tret (i int, j char)
            insert into tret values 
            (1,   'x'),
            (1,   'x'),
            (1,   'y'),
            (1,   'x'),
            (2,   'x'),
            (2,   'x'),
            (2,   'x'),
            (3,   'y'),
            (3,   'y'),
            (3,   'x'),
            (4,   'x'),
            (4,   'x'),
            (4,   'x')
        
        
            select * from tret where i in (select i from tret where j = 'y')
        

        【讨论】:

        • 如果您要提供查询示例,请确保它们是可行的示例。您的 insert 语句不起作用,并且您的 select 语句引用了上面未定义的 ij。意图很明确,但示例不起作用。
        猜你喜欢
        • 2015-02-25
        • 2015-09-29
        • 1970-01-01
        • 2019-03-01
        • 2016-05-13
        • 2013-03-30
        • 2018-06-10
        • 2015-07-07
        • 1970-01-01
        相关资源
        最近更新 更多