簡體   English   中英

如何根據條件在兩個表之間進行連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM