2013-07-17 208 views
0

我有2個表:SQL查詢時,匹配,選擇匹配時,不進行其他行選擇行

attribuut

attribuutvalue

他們有一個一對一很多關係。 一個attribuut可以有多個attribuutvalues。 這些屬性值包含狀態。

現在我想查詢這給我回的最新attribuutvalue從attribuut,其中有: 狀態或狀態。

然後我打我的問題: 當attribuut包含狀態,只有符合國家最新attribuutvalue的attribuutvalue應該顯示。

SELECT DISTINCT * FROM attribuut as att 
LEFT JOIN attribuutvalue as value ON (value.attribuuthead = att.displayid) 
WHERE value.status = 3 OR (value.status = 6 
AND NOT EXISTS 
    (SELECT * FROM attribuutvalue as value2 WHERE value2.valueid = value.valueid AND value2.status = 4)) 
ORDER BY valueid DESC 

但是,這給了我不是我想要的結果集。顯示狀態4仍然有屬性值。 它不給我只在列表中的最後一條記錄...

+1

這是相當混亂,我認爲你需要提供一些樣本數據和期望的輸出澄清,請! – JNK

回答

1

您遇到的第一個問題是您的NOT EXISTS子查詢。你應該已經加入了attribuuthead而不是valueid(我假設是該表上的唯一鍵)

其次你缺少一個機制來過濾每attribuuthead只有一個值。 ROW_NUMBER()可以實現這一點。

所以固定的查詢看起來是這樣的:

SELECT * FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY attribuuthead ORDER BY valueid DESC) RN 
    FROM dbo.attribuutvalue v 
    WHERE STATUS = 3 OR (Status = 6 AND NOT EXISTS (SELECT * FROM attribuutvalue v2 WHERE v2.attribuuthead = v.attribuuthead AND v2.STATUS = 4)) 
) x 
INNER JOIN attribuut a ON x.attribuuthead = a.displayid 
WHERE x.RN = 1 

SQLFiddle DEMO