【问题标题】:Select rows based on field values根据字段值选择行
【发布时间】:2020-03-19 22:32:09
【问题描述】:

我有这个结构

CREATE TABLE #Test
(
    Field1   VARCHAR(10),
    Field2   VARCHAR(10)
)

INSERT #Test VALUES('AAA','NO'),
                   ('BBB','NO'),
                   ('BBB','YES'),
                   ('BBB','SURE'),
                   ('CCC','NO'),
                   ('DDD','NO'),
                   ('DDD','YES'),
                   ('DDD','ALWAYS')

SELECT * FROM #Test 

每个不同的Field1 值都有Field2 'NO'。 我想从#Test 中选择所有行,这样如果不同的Field1 值具有多个Field2 值,则返回除Field2='NO' 的行之外的所有内容,否则返回'NO' 值。 所以结果应该是这样的

AAA只有'NO',所以我们返回它,BBB有多个,所以返回除了'NO'之外的所有东西。

我想在一个语句中选择它,而不删除等。我尝试了Field1分区的ROW_NUMBER(),但这并没有解决问题。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2017


    【解决方案1】:

    不存在:

    SELECT * FROM #Test t
    WHERE t.Field2 <> 'NO'
    OR NOT EXISTS (SELECT 1 FROM #Test WHERE Field1 = t.Field1 AND Field2 <> 'NO')
    

    请参阅demo。
    结果:

    > Field1 | Field2
    > :----- | :-----
    > AAA    | NO    
    > BBB    | YES   
    > BBB    | SURE  
    > CCC    | NO    
    > DDD    | YES   
    > DDD    | ALWAYS
    

    【讨论】:

      【解决方案2】:

      希望这个例子对你有所帮助。

      select Field1,Field2 from #Test where Field1 not in(SELECT Field1 FROM #Test where Field2<>'NO')
      UNION ALL
      SELECT Field1,Field2 FROM #Test where Field2<>'NO'
      order by Field1
      

      【讨论】:

        【解决方案3】:

        你可以使用窗口功能:

        SELECT t.Field1, t.Field2 
        FROM (SELECT t.*, 
                     SUM(CASE WHEN FIELD2 = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY FIELD1) AS NO_FLAG,
                     COUNT(*) OVER (PARTITION BY FIELD1) AS CNT
              FROM Test t
              ) t
        WHERE (CNT <> NO_FLAG AND FIELD2 <> 'NO') OR
              (CNT = NO_FLAG AND FIELD2 = 'NO');
        

        这里是demo。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-28
          • 1970-01-01
          • 2023-01-18
          • 2023-03-22
          • 1970-01-01
          相关资源
          最近更新 更多