[英]How to use CASE in JOIN statement to join two tables based on condition?
[英]How to do a join between two tables based on a condition?
我有這個問題:
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
我想避免這種情況。 我的意思是我只想為這種情況做一個JOIN
,而WHEN A.name IS NULL
並不是所有的時間(我的目的是避免無用的加入) 。 我怎樣才能做到這一點?
我不確定這會更有效,但從技術上講,使用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
更多信息: 哪一個更快:相關子查詢還是加入?
你不能真正部分避免加入,這可能; 但是進行原始連接可能只是更快,因為所有這些都可能會增加為每行比較計算的條件。
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
;
編輯:第二個想法,在非常大的數據集上,這可能是有用的東西; 但即使這樣,您也不可能在這種情況下選擇整個表格內容。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.