进行匹配时的SQL查询选择行,未进行匹配时选择其他行

时间:2013-07-17 12:09:46

标签: sql sql-server-2008 one-to-many

我有两张桌子:

  

attribuut

     

attribuutvalue

他们有一对多的关系。 属性可以有多个属性值。 这些属性值包含状态。

现在我想要一个查询,它可以从attribuut返回最新的attribuutvalue,其中包含: 州 3 或州 6

然后我遇到了我的问题: 当一个属性包含状态 4 的属性值时,只应显示状态为 3 的最新属性值。

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 个答案:

答案 0 :(得分: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