2016-05-18 34 views
1

我有這個疑問:如何根據條件在兩個表之間進行連接?

SELECT (CASE WHEN A.name IS NULL THEN B.name ELSE A.name END) 
FROM mytable A LEFT JOIN mytable B ON (A.related=B.id) 

它的工作原理,但JOIN總是會發生的,我的意思是JOIN出現爲那些兩種情況:

  • WHEN A.name IS NULL THEN B.name
  • ELSE A.name

我想避免這種情況。我的意思是我只想爲這個條件做一個JOINWHEN A.name IS NULL並非所有的時間(我的目的是避免無用的加入)。我怎樣才能做到這一點?

+0

「無用連接」是什麼意思? – Uueerdo

+0

我的意思是如果'A.name IS NULL'不是*真*,那麼我不需要'JOIN'。 – stack

回答

1

我不知道這將是任何更有效的,但在技術上使用correlated subquery會刪除多餘的join

SELECT 
    CASE WHEN name IS NULL 
    THEN (SELECT name FROM mytable B WHERE A.related = b.id) 
    ELSE A.name 
    END 
FROM mytable A 

的更多信息:Which one is faster: correlated subqueries or join?

+0

不錯......謝謝。 upvote – stack

+0

一個簡短的問題,那個子查詢將在'name is NULL'不是*真* *時執行? – stack

+0

還有,在我的查詢中,「JOIN」是什麼?當'name IS NULL'不是* true *時會執行嗎? – stack

1

你可能真的不能部分避免加入,但是執行原始聯接可能會更快,因爲它可能會增加爲每個行比較計算的條件。

SELECT (CASE WHEN A.name IS NULL THEN B.name ELSE A.name END) 
FROM mytable A 
LEFT JOIN mytable B ON A.name IS NULL AND A.related=B.id 
; 

從技術上講,這將避免它,但我很懷疑它會更快。

SELECT A.name 
FROM mytable A 
WHERE A.name IS NOT NULL 
UNION 
SELECT B.name 
FROM mytable A 
LEFT JOIN mytable B ON A.related=B.id 
WHERE A.name IS NULL 
; 

編輯:關於第二個想法,在非常大的數據集這可能是東西,可能是有幫助的;但即使如此,在這種情況下,您也不可能選擇整個表格內容。

+0

哦..在'ON'子句中加入'A.name IS NULL'是某種巧妙的..謝謝。給予好評。 – stack

+0

說實話,我不喜歡你的第二個查詢。我只想知道哪一個是你的選擇?你的第一個查詢?你的第二個查詢?我在問題中的查詢? – stack

+0

@stack就像我在第一句話中所說的那樣,取決於MySQL查詢優化器如何處理它,添加該條件可能不會阻止行比較,而是爲每個行比較添加額外的操作。 – Uueerdo

1
SELECT COALESCE(A.name, B.name) AS name 
FROM mytable A 
LEFT JOIN mytable B ON (A.related=B.id AND A.name IS NULL) 
+0

不錯... upvote – stack

+0

有時候我們會過時或解決問題;) –

相關問題