2010-04-15 78 views
0

考慮我在三個表上使用連接來獲得想要的結果集...Mysql加入 - 如何知道從哪個表檢索哪一行...?

現在在那個結果集中,是否有無論如何,我可以找出哪一行來自哪個表......?

更新: 我看到我錯誤地表述了這個問題....正如下面的答案之一所指出的,由join返回的結果集可能會包含由多個talbe組成的列。 。

所以問題實際上應該是「考慮我使用的三個表工會得到期望的結果集...」

+1

您的意思是_union_? – 2010-04-15 10:21:01

回答

3

如果你問這個問題,那麼你的數據庫可能是不正確的結構。 (正確地是一個主觀術語)。

規範化數據庫上正確的SQL查詢不應該依賴或不關心數據來自何處。

每行都是所有表的組合,空值插入到左/右/外連接的列中,這些列與連接標準不匹配。你也許可以測試一個列(來自一個特定的表)是否爲空,並且從中得出非空值必須來自相反的表。

然後,如果您實際上正在執行UNION,正如Marcelo所建議的那樣,您必須查看輔助列才能確定數據的來源,因爲這些信息會在組合中丟失。

+0

+1爲一個很好的答案.... 你能詳細說明'輔助'列...?例如, – SpikETidE 2010-04-15 11:01:54

+0

,「origin」列包含來自表a的'1',來自表b的'2'以及來自表c的'3'。 – dar7yl 2010-04-15 11:34:03

+0

哦......剛纔有這個想法我自己......但我想爲id字符串添加一個額外的字符,並以這種方式來識別表......就像它是從tbl 1開始的,那麼id將以a開頭,如果tbl2然後b..etc ... – SpikETidE 2010-04-15 11:36:40

5

您可以將表標識列添加到每個:

select 'A' as table_name, col1, col2 from A 
union 
select 'B' as table_name, col1, col2 from B 
union 
... 

這將返回由你的應用程序作爲任何普通的select語句來處理一個結果集:

while (rows available) { 
    row = fetchrow 
    if row.table_name == 'A' then 
    do special handling for table A 
    else if row.table_name == 'B' then 
    do special handling for table B 
    else if ... 

}

實際語法取決於您正在使用的語言,但大多數過程語言都遵循上面的方案。

+0

在結果集中引用這些行的語法是什麼...? – SpikETidE 2010-04-15 11:23:57

+0

所有行顯示爲從單個表中選擇。我在答案中增加了一個小節來說明如何處理這些問題。 – Martin 2010-04-15 11:42:58

+0

感謝您的建議..... +1讓我學習一個新的技巧... – SpikETidE 2010-04-16 04:09:41

相關問題