我需要在SQL Server数据库上创建一个视图,其中一个列可以从两个源中的任何一个中提取,具体取决于存在的内容。具体来说,我们有一系列这样的表(简化):
表1 :
personid
typeid (one of the values from Table2)
surname
forename
etc...
表2 :
typeid
typename
etc...
表3 :
attributeid
attributename
etc...
表4 :
valueid
attributeid (one of the values from table3)
typeid (one of the values from table2)
personid (one of the values from table1)
attributevalue
etc...
现在,我需要从table4中选择适用于某人的“attibutevalue”的值(除其他外)。这可能看起来很简单(加入personid并且你已经完成了),但事情并非那么简单。 Table4中可能没有带personid的行,在这种情况下,我们需要默认为与该类型关联的attributevalue。换句话说,从逻辑上讲,它是
if (there exists an attributevalue in t4 associated with personid)
use it
else
use attributevalue in t4 associated with typeid
我希望这很清楚。我一直在尝试研究是否可以通过一些微妙的连接或合并来完成,但却无法弄明白。
不幸的是,我对SQL的实践并不多,所以我会非常感谢一些指针!
最终我希望能够使用t3中的attributename编写查询(因此在此处包含它),但是现在,关键点只是为每个属性获取正确的值。
提前致谢
编辑:根据以下建议进行更新(评论时间过长!):
感谢您的投入。我试过这个,但它没有回复我们的期望。以下是数据样本:
表1:
PersonID 184
TypeID 49
...etc...
表4:
valueid 423 424 425 426 431 432
attributeid 4 5 6 7 6 5
typeid 49 49 49 49 49 49
personid NULL NULL NULL NULL 184 184
attributevalue yes track no no yes pay
etc...
因此,我们期望作为人员ID 184的属性值
4: yes
5: pay
6: yes
7: no
(默认为与相关typeid相关联的值,其中没有与非null personid关联的值)
为了清楚起见,稍微修改一下查询:
SELECT distinct t.id, p.AttributeID, isnull(p.attributevalue, p1.attributevalue) AS attributevalue
FROM table1 as T
LEFT JOIN table4 AS p ON p.personID = t.personID
left JOIN table4 p1 ON p1.typeID = t.typeID
where t.ID=184
我们回来了
id AttributeID attributevalue
184 5 pay
184 6 yes
所以它已经正确地拉回了有特定于personid的覆盖的值,而不是默认值。
任何更多的想法将不胜感激!
再次感谢
第二次更新:
感谢您的建议。最后我和其他地方一起去了,就是使用一个函数并在每个地方调用我需要插入一个值。它只返回给定人/类型/属性组合的适当值。像魅力一样。
答案 0 :(得分:0)
sql server is null看起来你需要的是null,下面是一个使用你的演示模式的演示。
SELECT isnull(p.atributeid,t.typeid) AS foo
FROM table1 as T
LEFT JOIN table4 AS p ON p.personid = t.personid
答案 1 :(得分:0)
我认为这就是你要找的东西。看看这个。
SELECT isnull(p.attributevalue ,p1.attributevalue) AS foo
FROM table1 as T
LEFT JOIN table4 AS p ON p.personid = t.personid
LEFT JOIN table4 p1 ON p1.typeid = t.typeID