代码之家  ›  专栏  ›  技术社区  ›  Gargoyle

SQL筛选出具有重复单元格值的行

  •  1
  • Gargoyle  · 技术社区  · 6 年前

    我有一个大查询,它返回的行中有一个列具有重复的值,例如:

    | sysid | col1 | col2
    | A     |  1   |  2
    | A     |  2   |  3
    | B     |  1   |  4
    

    sysid 是我要筛选的列,因此在上面的示例中,我只需要输出的最后一行,因为A多次出现。我尝试这样做以过滤掉它们:

    CREATE TABLE #temp (SysId VARCHAR(10), col1 INT);
    INSERT INTO #temp VALUES ('A', 1), ('B', 1), ('A', 1);
    
    WITH cte AS (
       SELECT * FROM #temp
    ), sysids AS (
       SELECT SysId FROM #temp GROUP BY Sysid HAVING COUNT(*) = 1
    )
    SELECT * FROM #temp WHERE EXISTS (SELECT SysId FROM sysids);
    
    DROP TABLE #temp;
    

    在上面的示例中,我希望final select只包含B行。但我仍然得到了所有这些,我不明白为什么。

    显然,在这个具体的例子中,我不需要 cte 但我真正的查询对于多个联合是非常复杂的。

    3 回复  |  直到 5 年前
        1
  •  2
  •   sticky bit    6 年前

    您可以使用相关的聚合子查询和 NOT EXISTS

    SELECT t1.*
           FROM #temp t1
           WHERE NOT EXISTS (SELECT ''
                                    FROM #temp t2
                                    WHERE t2.sysid = t1.sysid
                                    HAVING count(*) > 1);
    
        2
  •  1
  •   Vitaly Borisov    6 年前

    请试试这个:

    ;WITH cte AS (
        SELECT t.SysId,t.col1,COUNT(1)OVER(PARTITION BY t.SysID) AS [cnt] 
        FROM #temp t
    ) 
    SELECT c.SysId,c.col1
    FROM cte c WHERE c.cnt = 1;
    
        3
  •  0
  •   RN92 vipin kumar    6 年前
    CREATE TABLE #temp (SysId VARCHAR(10), col1 INT);
    INSERT INTO #temp VALUES ('A', 1), ('B', 1), ('A', 1);
    
    WITH cte AS (
       SELECT * FROM #temp
    ), sysids AS (
       SELECT SysId FROM #temp GROUP BY Sysid HAVING COUNT(SysId) =1
       )
    SELECT * FROM #temp WHERE SysId IN (SELECT SysId FROM sysids);
    
    DROP TABLE #temp;