2011-02-16 239 views
2

我有一個關於下面的代碼片段的問題。我想知道,如果第一個查詢沒有帶來任何結果,我仍然會得到第二個查詢的結果嗎?mysql左連接查詢

select * 
from 
(
    -- first query 
) as query1 
left join 
(
    -- second query 
) as query2 
on query1.id=query2.id 
left join 
(
    -- third query 
) as query3 
on query1.id=query3.id; 

更新

我需要的是一個完整的聯接,然而,MySQL不支持的話,這將是仿效這個好辦法?

+0

我已更新我的答案以回答您更新的問題。 – btilly 2011-02-16 15:32:49

回答

1

不,你需要做一個正確的連接。

3

答案是否定的。

左連接會從左側拉出所有結果,並且只會匹配右側的結果。正確的加入恰恰相反。完整的外連接將從所有結果中提取所有結果,並只加入那些可以加入的結果。

請注意,對於當前數據庫,避免完全外連接是明智的,因爲它們比其他連接效率低得多。我曾親自設法擊敗Oracle和PostgreSQL全連接數量級的,像這樣的招數,也可用於模擬完全外部的數據庫連接沒有他們:

SELECT some_id 
    , MAX(foo) AS foo 
    , MAX(bar) AS bar 
    , MAX(baz) AS baz 
    , MAX(blat) AS blat 
FROM (
     SELECT A.some_id 
     , A.foo 
     , A.bar 
     , NULL as baz 
     , NULL as blat 
     FROM A 
    UNION ALL 
     SELECT B.some_id 
     , NULL as foo 
     , NULL as bar 
     , B.baz 
     , B.blat 
     FROM B 
) AS subquery 
GROUP BY some_id; 

有該查詢可能無法正常工作,因爲數據庫不會計算出空列的類型。有解決方法。最簡單的方法是創建一個具有顯式列類型的臨時表,使用2個插入查詢模擬UNION ALL,然後從臨時表中查詢。

(爲我的格式樣式的說明,請參見http://bentilly.blogspot.com/2011/02/sql-formatting-style.html。)

0

沒有,因爲從第二查詢結果追加到第一個查詢結果。

0

不,因爲您已離開加入。首先添加第二個記錄。如果沒有第一個沒有第二個記錄可以添加。通過正確的連接可以進行反轉。