2013-02-06 41 views
2

假設我爲同一記錄分配了兩個不同的ID。例如SQL查詢來查找假否定w.r.t數據匹配或實體分辨率

 
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服務器中編寫一個查詢來返回這些記錄?

回答

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) 
+0

非常感謝。您的查詢爲我工作。我真的很感激它。 – Huzaifa

1

假設我理解你的要求,我想你需要的是一個INNER JOIN

SELECT DISTINCT T.* 
FROM YourTable T 
    JOIN YourTable T2 ON T.ID1 = T2.ID1 AND T.ID2 <> T2.ID2 

這裏是SQL Fiddle

請注意,在這個例子中,它返回來自X和Y. X的所有行,因爲A和B; Y是因爲C和D.這是正確的嗎?

祝你好運。

+0

是的,你是對的。我明天會測試你的查詢,並告訴你它是否工作。 – Huzaifa

+0

@胡扎法 - 很高興我能幫上忙。祝你好運。 – sgeddes

+0

謝謝。但是,SQL查詢正在返回表中的所有行 – Huzaifa

1

我認爲你正在尋找這樣的:

SELECT RecordID, ID1, ID2 
FROM yourtable 
WHERE ID1 IN (SELECT ID1 
       FROM yourtable 
       GROUP BY ID1 
       HAVING COUNT(DISTINCT ID2)>1); 

見小提琴here

+0

它以某種方式不算,並給我錯誤'>' – Huzaifa

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不匹配的那些行。

+0

它返回我表中的所有行。 – Huzaifa

+0

[適用於我。](http://sqlfiddle.com/#!3/f10c12/1) –