【问题标题】:Select ALL records with fieldvalue1 if any records (with fieldvalue1) have fieldvalue3 have a specific value如果任何记录(具有字段值 1)具有字段值 3 具有特定值,则选择具有字段值 1 的所有记录
【发布时间】:2019-09-20 19:53:24
【问题描述】:

如果其中任何一条记录具有另一个特定值,我需要显示特定值的所有记录。本质上,如果 field3 = 'b',那么 field1 是什么?显示值为 field1 的所有记录,无论其 field3 值如何。

Record Number   External Id Letter
1            123456            a
2            123456            b
3            123456           c
4            456852           t
5            456852           b

记录 2 的字母值为 'b' - 所以我想查看 externalid,即 123456,现在我想提取外部 id 的所有记录,无论其他记录的字母值是否为 'b'

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    使用EXISTS 和相关子查询:

    SELECT *
    FROM mytable t
    WHERE 
        t.letter = 'b'
        OR EXISTS (
            SELECT 1
            FROM mytable t1
            WHERE 
                t1.record_number != t.record_number 
                AND t1.external_id = t.external_id 
                AND t1.letter = 'b'
        )
    

    另一种选择是使用窗口函数:

    SELECT record_number, external_id, letter
    FROM (
        SELECT 
            t.*,
            MAX(CASE WHEN letter = 'b' THEN 1 END) OVER(PARTITION BY external_id) mx
        FROM mytable t
    ) x WHERE mx = 1
    

    Demo on DB Fiddle

    记录号 |外部标识 |信 ------------: | ----------: | :----- 1 | 123456 |一种 2 | 123456 | b 3 | 123456 | C 4 | 456852 |吨 5 | 456852 | b

    【讨论】:

      【解决方案2】:

      使用exists,但不用担心在外部查询中过滤:

      select t.*
      from t
      where exists (select 1
                    from t t2
                    where t2.external_id = t.external_id and t2.letter = 'b'
                   );
      

      (external_id, letter) 上有一个索引,我希望它有很好的性能。

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 2020-01-14
        • 2013-04-14
        • 2012-06-20
        相关资源
        最近更新 更多