2015-09-25 38 views
1

我的數據庫表(DWInfo)看起來是這樣的:SQL:如何檢查「如果這個記錄存在,那麼該記錄還必須存在」爲給定的ID設置

InstanceID | AttributeID 
1   | 1 
1   | 2 
1   | 3 
2   | 1 
2   | 4 
3   | 1 
3   | 2 

有幾個實例,每個實例有多個屬性。 我想要達到的是這樣的:對於一個給定的ID /規則的ID我想獲得違反條件的所有InstanceID,例如讓給定的ID是1和2,這意味着如果有一個AttributeID = 1的實例,Attribute = 2也應該存在它。在這種情況下,結果將是實例2,因爲此實例違反了條件。

我試着用JOINS,但這隻對2個屬性有效,而不是更多。

Select * from DWInfo dw1 INNER JOIN DWInfo dw2 ON dw1.InstanceID = dw2.InstanceID where dw1.AttributeID != dw2.AttributeID and dw1.AttributeID = 1 AND dw2.AttributeID != 2 

是否有可能通過SQL查詢解決此問題?

+0

不明白你的問題,請把你想要的結果查詢的例子 –

+0

@GabrielRodriguez OP表示他們想要樣本數據的結果2。 – Arth

回答

0

假設每個InstanceId只能有每個不同AttributeId之一,即一個獨特的複合索引(InstanceId, AttributeId)

SELECT InstanceID 
    FROM DWInfo 
    WHERE AttributeID IN (1,2) 
GROUP BY InstanceID 
    HAVING SUM(AttributeId = 1) = 1 
    AND COUNT(*) < 2 /* Or SUM(AttributeId = 2) = 0 */ 

SQLFiddle DEMO

注意,如果具有2屬性ID意味着該實例需要的屬性Id 1也..略有不同的邏輯,這是更加整潔:

SELECT InstanceID 
    FROM DWInfo 
    WHERE AttributeID IN (1,2) 
GROUP BY InstanceID 
    HAVING COUNT(*) < 2 
0

我認爲這是做你想做的:

select instanceid 
from dwinfo 
where attributeid in (1, 2) 
group by instanceid 
having count(*) = 2; 

這可以保證你有兩個匹配的行爲每個實例。如果你能有重複,然後使用:

having count(distinct attributeid) = 2 

編輯:

對於條件版本(如果1 - > 2):

having max(attributeid = 2) > 0 

也就是說,如果有1個或2,那麼它必須有2,並且一切都很好。

+0

從技術上講,問題並沒有表明具有2但不是1的AttributeId是違規行爲;只有一個AttributeId爲1但不是2。另外問題是如何獲得違規不正確的實例。 – Arth

+0

@你說得對。具有AttributeID 2但不是1是違規行爲。 我不記得IN函數,但正如Arth所說,我需要違規。但這仍然非常有幫助。如果沒有其他可能性,我首先可以查詢包含第一個屬性的所有數據,然後使用您的解決方案來獲取滿足條件的所有實例。 – Cmon

0

如果存在屬性1發現,沒有屬性2.

select InstanceID 
from DWInfo 
group by InstanceID 
having 
     count(case when AttributeID = 1 then 1 end) > 0 
    and count(case when AttributeID = 2 then 1 end) = 0 

這個答案的那些基本相同的阿瑟的。您可能會發現篩選where子句中的屬性是有益的,但這不是絕對必要的。我更喜歡使用case表達式的標準語法,儘管如果它是便攜式的,簡寫會很方便。在這些情況下,我更喜歡count而不是sum

目前還不清楚您是否可能有重複(可能不是)以及屬性2是否可以單獨出現。您可能需要調整一些數字,但您應該能夠遵循該模式。