2010-07-03 56 views
7

我試圖做選擇多個表,當一個表是空在MySQL

SELECT * FROM a, b 

但是,如果一個表是空的它不返回任何東西。我如何做到這一點,所以即使另一個是空的,它也會返回'a'?

+2

http://dev.mysql.com/doc/refman/5.0/en/join.html 您正在使用的形式'INNER JOIN'其結果是x * y記錄,所以如果其中1個有0行,那麼x * 0 = 0. – 2010-07-03 11:10:51

回答

19

from子句中使用兩個表在功能上等同於一個cross join

select * 
from A 
cross join 
     B 

這將返回A的一排中B.每一行;當B是空的,結果是空的了。你可以通過使用left join來解決這個問題。使用left join,即使其中一個表爲空,也可以返回行。例如:

select * 
from A 
left join 
     B 
on  1=1 

隨着病情1=1永遠是真實的,這就像一個cross join但它也適用於空表。

+0

FYI,「在MySQL中,CROSS JOIN是一個等效於INNER JOIN的語法(它們可以相互替換) 「 – 2010-07-03 11:15:48

+0

@Imre L:有趣。如果沒有'on'子句,即使MySQL允許'inner join'出於相同的目的,按照慣例使用'cross join'可能會更清楚一些! – Andomar 2010-07-03 11:20:54

+0

是的。我個人更喜歡省略'INNER'和'CROSS'等詞,但是我不喜歡在連接表上使用某些條件時使用內聯CROSS JOIN。如果在返回0行的表A上使用WHERE子句(該表不是空的),則 – 2010-07-03 11:33:30

1
SELECT * FROM a LEFT JOIN b ON a.ID = b.ID 

即使b爲空,也會返回所有內容。

+0

您假定有可加入的字段,可能沒有共同的字段。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。 – strattonn 2015-09-22 01:43:33

1

你應該做一個左連接。

像這樣

SELECT * 
FROM A 
LEFT JOIN B ON A.ID = B.ID 

然後您會收到A中的行和相應行B中是否存在。

+0

你認爲有加入的領域,可能沒有共同的領域。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。這是整個問題的關鍵,加入沒有公共領域的空集。 – strattonn 2015-09-22 01:44:25

+0

是的,你是對的,在這種情況下,需要交叉連接或條件1 = 1,這幾乎是相同的。 – 2015-09-22 23:27:14

0

上面提到的查詢顯示兩個表的聯接,如果一個包含2條記錄並且b包含7條記錄,它將顯示7 * 2 = 14條記錄。在你的情況下,其中一個表是空的(有0個記錄),它不會顯示任何數據。如果仍然想要顯示數據並且表與沒有任何關係,則需要檢查兩個表的計數是否大於0。否則,顯示僅來自一個非空的表的記錄。

1
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id 
在這個例子中ID

僅僅是例子名連接鍵

+0

你認爲有加入的領域,可能沒有共同的領域。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。 – strattonn 2015-09-22 01:44:03