2011-03-02 25 views
0

我在我的數據庫中有3個表。他們每個人都有一列,「索引」,連接所有領域的領域3.SQL加入/聯合幫助 - 將表b和c鏈接到表a?

我們的出發點是表a和它裏面的索引。如果索引不存在,我不需要它。

表b和c非常相似,並且表a中列出的每個索引都將在b或c中,或者兩者都有。我需要做的就是確保表a中的所有字段都連接到表b或c中的字段。

我開始:

SELECT * 
FROM `table_a` 
JOIN table_b ON table_a.index = table_b.index 

偉大的工程。但是,這將排除表中的所有索引中的不匹配,這就是爲什麼我相信,當我添加:

UNION 
FROM `table_a` 
JOIN table_c ON table_a.index = table_c.index 

我居然得到更少的結果,而不是更多。

有人能告訴我怎麼說「如果索引不在表b中,然後看錶c?」

+0

要知道聯盟的差異和UNION ALL – Magnus 2011-03-02 16:09:17

回答

1

我不確定這是什麼,但它會給你所有的結果,以及任何可能的匹配從b或c。

SELECT * 
FROM table_a 
    LEFT OUTER JOIN table_b ON table_a.index = table_b.index 
    LEFT OUTER JOIN table_c ON table_a.index = table_c.index 
+0

不太我是什麼之後,但有用。我是從表b或表c中的更多匹配。 – Soop 2011-03-02 16:46:55

0

你試過「Union All」嗎?

SELECT * 
FROM `table_a` 
JOIN table_b ON table_a.index = table_b.index 
UNION ALL 
SELECT * 
FROM `table_a` 
JOIN table_c ON table_a.index = table_c.index 
+0

注意:如果索引同時位於table_b和table_c中,Union All將返回2行。 – 2011-03-02 16:11:39

+0

是的,試過了,那實際上產生了少一個IIRC的結果。 – Soop 2011-03-02 16:47:33

0

第一步:

SELECT * FROM 
table_a 
LEFT JOIN table_b ON table_a.index = table_b.index 
LEFT JOIN table_c ON table_b.index = table_c.index 

這將讓你從所有3代表的所有索引。

如果你想擁有這不是NULL從表中_a,_b或_c你可以在MySQL做這樣的第一指標:

SELECT COALESCE(table_a.index, table_b.index, table_c.index) AS firstIndexFromABC 
FROM 
table_a 
LEFT JOIN table_b ON table_a.index = table_b.index 
LEFT JOIN table_c ON table_b.index = table_c.index 

或者,您使用的是什麼數據庫? 更新: MySQL的

更新一些意見後:

對不起,我還是不明白這一點。這就是COALESCE方法的作用。如果不存在,你得到1列合併了a的值,如果不存在,你得到b,如果不存在,則得到c。

如果你的意思是,你想要的信息,從該表中你拿了指數那就試試這個:

SELECT COALESCE(table_a.index, table_b.index, table_c.index) AS firstIndexFromABC, 
CASE WHEN table_a.index IS NULL AND table_b.index IS NULL THEN 'c' 
    WHEN table_a.index IS NULL AND table_b.index IS NOT NULL THEN 'b' 
    WHEN table_a.index IS NOT NULL THEN 'a' 
END AS whichTable 
FROM 
table_a 
LEFT JOIN table_b ON table_a.index = table_b.index 
LEFT JOIN table_c ON table_b.index = table_c.index 
+0

這是MySQL ...我瞭解第一個,(不幸的是,雖然有用,如第一條評論,我正在尋找表b或表c - 不是兩個)。 第二個我不明白它在做什麼。結果實際上只是「firstIndexFromABC」標題下的索引列表。所以我猜這不是它應該做的。 – Soop 2011-03-02 16:54:38

+0

「尋找表b或表c - 不是兩個」< - 我不明白。在第二個方法中,COALESCE方法接受列的列表並返回第一個不爲NULL的列。所以使用SELECT *你會得到類似於index_a |的結果index_b | index_c,而我認爲index_a或index_b或index_c可以是NULL或其中的兩個,但是至少有一個索引。通過COALESCE,您可以獲得第一個訂單a,b,c,它實際上有一個索引。 – fancyPants 2011-03-02 17:03:58

+0

基本上,我們需要表a中的所有字段。 b或c中的信息應該大致相同,所以如果它不在表b中,那麼我想讓它看在表c中。 然後我們應該得到如下列的字段列表: a,a,a,a,b,b,b,b,b,b,b,b a,a,a,a,c,c, c,c,c,c,c,c,a,a,a,b,b,b,b,b,b,b,b a,a,a,a,b,b, b,b,b,b,b,a,a,a,c,c,c,c,c,c,c,c a,a,a,a,b,b,b, b,b,b,b,a,a,a,b,b,b,b,b,b,b,b,a,a,a,c,c,c,c,c, c,c,c' – Soop 2011-03-03 09:28:44