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

时间:2019-01-10 22:56:44

标签: sql sql-server

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

| 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;

在以上示例中,我希望最终选择仅包含B行。我仍然得到所有这些信息,但我不明白为什么。

很明显,在这个特定示例中,我不需要cte部分,但是我的实际查询非常复杂,包含多个联合。

3 个答案:

答案 0 :(得分:2)

您可以使用关联的汇总子查询和NOT EXISTS

SELECT t1.*
       FROM #temp t1
       WHERE NOT EXISTS (SELECT ''
                                FROM #temp t2
                                WHERE t2.sysid = t1.sysid
                                HAVING count(*) > 1);

答案 1 :(得分:1)

请尝试以下操作:

;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;

答案 2 :(得分:0)

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;