如果存在或如果不存在,如何在SQL Server视图中选择值

时间:2013-04-17 20:08:42

标签: sql sql-server select join view

我需要在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的覆盖的值,而不是默认值。

任何更多的想法将不胜感激!

再次感谢

第二次更新:

感谢您的建议。最后我和其他地方一起去了,就是使用一个函数并在每个地方调用我需要插入一个值。它只返回给定人/类型/属性组合的适当值。像魅力一样。

2 个答案:

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