选择满足组条件的行(无临时表)

Pio*_*ski 10 sql-server group-by

有 3 列的表:

ID  category    flag
1       A       1
2       A       0
3       A       0
4       B       0
5       C       0
Run Code Online (Sandbox Code Playgroud)

我想选择flag = 1每个类别至少有一次的所有行。

预期成绩:

ID  category    flag
1       A       1
2       A       0
3       A       0
Run Code Online (Sandbox Code Playgroud)

可以使用这样的临时表来解决:

select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Run Code Online (Sandbox Code Playgroud)

但我更喜欢分组的解决方案,我很难想出。任何帮助将不胜感激。

Jul*_*eur 16

GROUP BY不能单独使用,因为它每组只返回 1 行 ( category)。


  • 您可以将子查询与flag = 1和一起使用INNER JOIN

    SELECT d1.ID, d1.category, d1.flag
    FROM data d1
    INNER JOIN (
        SELECT DISTINCT category FROM data WHERE flag = 1
    ) d2 
        ON d2.category = d1.category ;
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用以下EXISTS条款:

    SELECT d.ID, d.category, d.flag
    FROM data d
    WHERE EXISTS (
        SELECT 1 FROM data WHERE flag = 1 AND category = d.category
    ) ;   
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用IN子句(虽然EXISTS更好):

    SELECT d.ID, d.category, d.flag
    FROM data d
    WHERE d.category IN (SELECT category FROM data WHERE flag = 1) ;
    
    Run Code Online (Sandbox Code Playgroud)
  • 您还可以CROSS APPLY与子查询一起使用flag = 1

    SELECT d.ID, d.category, d.flag
    FROM data d
    CROSS APPLY (
        SELECT TOP (1) category 
        FROM data 
        WHERE flag = 1 AND category = d.category
    ) ca ;
    
    Run Code Online (Sandbox Code Playgroud)

DISTINCT如果对于每个类别,只有 1 行可以有flag = 1.

输出:

ID  category    flag
1       A       1
2       A       0
3       A       0
Run Code Online (Sandbox Code Playgroud)