2013-02-28 53 views
0

我有三個表AB和C(最後一個是我想要的結果)如何留下兩個表外連接第三臺

A.id  B.age   C.id C.age  result id age 
    1   5   1  5    1 5 
    2   6   2  0   null null 
    3   7   0  7   null null 
    4   8   4  8    4 8 
    5   9   5  9    5 9 

我想做的事情外從連接和B到C,結果我得到了上面的結果。 如果C中缺少任一列,則它應該爲空。 如果我做一個內部聯接:

select a.id, b.age where a.id = c.id and b.age = c.age 

我會得到3行回來。 我還想要回5行。我正在使用IBM db2 v9的東西。 我試圖找出使用較新的左外連接語法如何讓它走,但我沒有看到它。 我可以看到我如何在舊的sybase * =外部連接語法中執行它,但我無法看到如何以新的樣式方式執行此操作。 這甚至可能嗎?

有人建議做一個每個結果的一半的聯合。工會只是弄得一團糟,在我看來,我應該可以從兩個表中做一個左外連接。

幫助? 謝謝。

+2

你正在使用什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,並且適用於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等... – 2013-02-28 16:45:33

+0

ibm db2。我認爲這是版本9的東西。 – stu 2013-02-28 16:48:57

+0

...你爲什麼要這些空值?他們沒有真正告訴你任何有用的信息。 – 2013-02-28 16:59:33

回答

-1

對不完整和不正確的「FULL JOIN」帖子。

豈不是:

select case when b.age is not null then a.id end as id 
    , case when a.id is not null then b.age end as age 
from c 
    left join a on a.id = c.id 
    left join b on b.age = c.age 
+2

......恐怕你需要提供一個實際的例子 – 2013-02-28 16:57:11

+0

你能解釋一下如何交叉連接三張表嗎?這對我來說是新的。 – stu 2013-02-28 16:57:22

+0

我查了一下,完全加入會給我一個笛卡兒的產品,我不想要。 – stu 2013-02-28 17:21:12

0

你的意思呢?

SELECT a.id, b.age 
FROM a 
CROSS JOIN b 
LEFT OUTER JOIN c on a.id = c.id AND b.age = c.age 

你的問題不是你是否CROSS JOIN A和B還是B也留下加入明確:

SELECT a.id, b.age 
FROM a 
LEFT OUTER JOIN c on a.id = c.id 
LEFT OUTER JOIN b on b.age = c.age 

還有更可能的組合...

+0

我試過這個,但是db2似乎不願意使用這個語法。其實我嘗試了一些不同的東西,讓我舉一個例子,謝謝。 – stu 2013-02-28 16:56:56

+0

對不起,只是猜測 – devio 2013-02-28 16:59:52

+0

不行,我得到了笛卡爾式的結果。它產生了id和年齡的每種組合。但一個好主意,謝謝。 – stu 2013-02-28 17:08:54

0
-- A Dummy table 
with A as (
    select 
    2 as id 
    from 
    sysibm.sysdummy1) 

-- B Dummy table 
, B as (
    select 
    6 as age 
    from 
    sysibm.sysdummy1) 

-- C Dummy table  
, C as (
    select 
    2 as id, 
    0 as age 
    from 
    sysibm.sysdummy1) 


-- Actual result query 
select 
    A.id as "A.id", 
    B.age as "B.age", 
    C.id as "C.id", 
    C.age as "C.age", 
    case 
    when A.id = C.id and B.age = C.age then 
     C.id 
    else 
     null 
    end as "result id", 
    case 
    when A.id = C.id and B.age = C.age then 
     C.age 
    else 
     null 
    end as "result age" 
from 
    sysibm.sysdummy1 as Dummy 
    left outer join A as A on 1=1 
    left outer join B as B on 1=1 
    left outer join C as C on 1=1 

這是我的解決方案,將產生匹配的結果到原始文章。用所提供的例子換出A,B和C啞表中的值。

編輯: 同樣的結果,而無需使用case語句:

select 
    A.id as "A.id", 
    B.age as "B.age", 
    C.id as "C.id", 
    C.age as "C.age", 
    R.id as "result id", 
    R.age as "result age" 
from 
    sysibm.sysdummy1 as Dummy 
    left outer join A as A on 1=1 
    left outer join B as B on 1=1 
    left outer join C as C on 1=1 
    left outer join C as R 
    on A.id = R.id 
    and B.age = R.age 
0

這是在這個問題上反應遲緩,但下面的查詢應該這樣做。

我已創建http://sqlfiddle.com/#!3/07d74/5

在線sqlfiddle您可以使用上面的在線sqlfiddle驗證您的要求。它給出了您要求的完全相同的結果。

即使大量使用Google搜索,我仍找不到用於運行DB2查詢的在線工具,但是在提出此查詢之前,我檢查了IBM關於DB2語法的交叉連接和左連接的文檔。所以,它應該在DB2中工作,但如果您發現任何問題,請讓我知道。 如果您知道DB2的在線工具,請告訴我。 sqlfiddle基於Sql Server,因爲在sqlfiddle上沒有DB2的選項,但正如我所說的那樣,根據我讀的文檔,查詢與DB2兼容。

DB2兼容查詢如下。

SELECT D.id, 
     D.age 
FROM C 
LEFT OUTER JOIN 
    (SELECT A.id, 
      B.age 
    FROM A 
    CROSS JOIN B) D ON D.id = C.id 
AND D.age = C.age; 
相關問題