用于查找数据匹配或实体解析的错误否定的SQL查询

时间:2013-02-06 21:27:06

标签: sql sql-server entity resolution matching

假设我为同一记录分配了两个不同的ID。例如

RecordID | ID1 | ID2
--------------------
1        | X   | A
2        | X   | B
3        | Y   | C
4        | Y   | C
5        | Y   | D
6        | Z   | E
7        | Z   | E

现在,我想获取将ID1分配给相同值的记录,其中ID2被分配给不同的值。

例如,我想得到:

1, X, A
2, X, B

这里ID1为它分配了X,其中ID2为它分配了A和B,两个不同的值。

是否可以在SQL或SQL服务器中编写将返回此类记录的查询?

2 个答案:

答案 0 :(得分:1)

您需要使用子查询,其中,对于每一行,您在表格中查看是否有任何其他行符合与其相关的特定条件。

伪sql:

select 
      t1.id, 
      t1.variable, 
      t1.value 
   from 
      table t1 
   where 
      exists ( select 1 
                  from t2 
                  where t2.id != t1.id 
                    and t2.variable == t1.variable 
                    and t2.value != t1.value)

答案 1 :(得分:1)

如果这是SQL Server 2005 +:

WITH minmax AS (
  SELECT
    *,
    minID2 = MIN(ID2) OVER (PARTITION BY ID1),
    maxID2 = MAX(ID2) OVER (PARTITION BY ID1)
  FROM atable
)
SELECT
  RecordID,
  ID1,
  ID2
FROM minmax
WHERE minID2 <> maxID2
;

minmax CTE中,添加了另外两列,其中包含具有相同ID2的每组行的最小和最大ID1。主查询仅返回相应的最小ID2与最大ID2不匹配的行。