我有两张桌子:
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的属性值。 并且它不仅仅给我列表中的最后一条记录......
答案 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 强>