SQL Join / Union

时间:2014-11-04 12:39:59

标签: sql join ingres

我有两个语句要合并到一个输出中。

声明一:

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个名称和值,我仍然希望显示第一个查询中的完整名称集,没有值。如果两个查询都返回了所有四个值,则将显示所有四个值。

很抱歉我必须添加,我使用Ingres SQL,所以我无法使用ISNULL功能。

3 个答案:

答案 0 :(得分:2)

您可以进行左连接。这可确保第一个表中的所有记录都保持包含在内。其中value为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' 

答案 1 :(得分:1)

我建议使用LEFT OUTER JOIN语法进行自我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' 

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