如果您想要表中的实际行,而不仅仅是符合条件的 id, value1 对,您可以这样做:
WITH discrepancies AS (
SELECT,
id,
value1,
value2,
distinctcount = COUNT(DISTINCT value2) OVER (PARTITION BY id, value1)
FROM
dbo.atable
)
SELECT
id,
value1,
value2
FROM
discrepancies
WHERE
distinctcount > 1
;
如果 SQL Server 2008 支持 COUNT(DISTINCT ...) 和 OVER clause。
基本上,这与Giorgi Nakeuri's one 的想法差不多,只是你不会多次上桌。
唉,到目前为止还有no support for COUNT(DISTINCT ...) OVER ... in SQL Server。不过,您可以使用不同的方法,它仍然允许您只触摸一次表格并返回详细信息行:
WITH discrepancies AS (
SELECT,
id,
value1,
value2,
minvalue2 = MIN(value2) OVER (PARTITION BY id, value1),
maxvalue2 = MAX(value2) OVER (PARTITION BY id, value1)
FROM
dbo.atable
)
SELECT
id,
value1,
value2
FROM
discrepancies
WHERE
minvalue2 <> maxvalue2
;
这里的想法是每个id, value1 获得MIN(value2) 和MAX(value2) 并查看它们是否不同。如果是这样,则意味着您在此 id, value1 子集中存在差异,并且您希望返回该行。
该方法利用带有 OVER 子句的聚合来避免自连接,这正是表在此处仅访问一次的原因。