2014-11-04 94 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