2013-07-17 166 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