我有一个很大的查询,该查询返回的行中有一个列具有重复的值,例如:
| 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
部分,但是我的实际查询非常复杂,包含多个联合。
答案 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;