2014-11-04 93 views
0

我有两个要合并到一个输出的语句。SQL Join/Union

说明一:

select name from auxiliary_variable_inquiry 
where inquiry_idbr_code = '063' 

返回名称的下面的列表:

Name 
------------ 
Affiliates 
NetBookValue 
Parents 
Worldbase 

声明二:

select name, value from auxiliary_variable_value 
where inquiry_idbr_code = '063' 
and ru_ref = 20120000008 
and period = 200912 

返回如下:

Name  Value 
------------------- 
Affiliates  112 
NetBookValue 225.700 

我想有一个像这样的输出:

Name   Value 
------------------- 
Affiliates 112 
NetBookValue 225.700 
Parents  0 
Worldbase  0 

所以基本上,如果第二次查询只返回2名和值,我还是想从第一个查询显示完整的名称集,没有任何价值。如果所有四个值都由两个查询返回,则将显示全部四个值。

对不起,我必须添加,使用安格斯SQL即时通讯,所以我无法使用ISNULL函数。

+0

你使用哪种版本的Ingres? IFNULL()可用,或者可以像下面的人那样使用CASE。 $可能是因为结果正在以MONEY类型返回。 Value的数据类型是什么? – PaulM 2014-11-04 13:47:14

回答

1

我推荐使用LEFT OUTER JOIN语法的自连接。包括在JOIN条件第二次查询您的“额外”的条件,而第一个条件留在WHERE,就像这样:

select a.name, CASE WHEN b.Value IS NULL THEN 0 ELSE b.Value END AS Value 
    from 
     auxiliary_variable_inquiry a 
     LEFT JOIN 
     auxiliary_variable_inquiry b ON 
      a.name = b.name and -- replace this with your real ID-based JOIN 
      a.inquiry_idbr_code = b.inquiry_idbr_code AND 
      b.ru_ref = 20120000008 AND 
      b.period = 200912 
    where a.inquiry_idbr_code = '063' 
+0

为ISNULL() – AHiggins 2014-11-04 13:01:06

+0

换掉了COALESCE()这很好,但再次出于某种原因,它将$添加到值列? – 2014-11-04 13:03:39

+0

你的意思是这个列的名称包含$符号(例如'$ Value',或者内容包含它(例如'$ 0')吗? – AHiggins 2014-11-04 13:05:44

2

你可以做一个左连接。这确保来自第一个表格的所有记录将保持包含在内。如果值为null,则不会找到子记录,并且在这些情况下我们使用coalesce来显示0。

select i.name, COALESCE(v.Value,0) from auxiliary_variable_inquiry i 
left join auxiliary_variable_value v 
on v.inquiry_idbr_code = i.inquiry_idbr_code 
and v.ru_ref = 20120000008 
and v.period = 200912 
where i.inquiry_idbr_code = '063' 
+0

嗨,我已经试过这个,由于某种原因,它在col2上添加了$,这些值看起来不正确。而不是只填写0为父母和worldbase其复制价值从分支机构和NBV – 2014-11-04 12:47:45

+0

这很奇怪。如果您可以在http://sqlfiddle.com/上重现此问题,我会很乐意看看它。 – wvdz 2014-11-04 12:58:48

+0

@popovitsj,我想这是因为你链接了'inquiry_idbr_code'值,这个例子中的所有四条记录都是'063'。 JOIN需要包含'name'字段(请参阅下面的答案 - 也许你可以找出$的东西),或每个记录独有的ID。 – AHiggins 2014-11-04 13:13:05

0

如果我得到正确的,你应该使用类似:

SELECT i.NAME, 
     v.NAME, 
     v.value 
FROM auxiliary_variable_inquiry i 
     LEFT JOIN auxiliary_variable_value v 
       ON i.inquiry_idbr_code = v.inquiry_idbr_code 
WHERE v.ru_ref = 20120000008 
     AND v.period = 200912 
+0

Nico,使用'WHERE'子句中的第二个表中的元素有效地将'LEFT JOIN'变成'INNER JOIN' ... – AHiggins 2014-11-04 12:51:56

+0

嗨,这并不完全返回什么即时通讯后,名字列似乎是重复的,但没有0值,只是重复的返回的。 – 2014-11-04 12:54:19