如何根据条件在两个表之间进行连接?

时间:2016-05-18 18:54:50

标签: mysql sql join

我有这个问题:

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而不是所有的时间(我的目的是避免无用的加入)。我怎么能这样做?

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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
;

编辑:第二个想法,在非常大的数据集上,这可能会有所帮助;但即便如此,在这种情况下你也不太可能选择整个表格内容。

答案 2 :(得分: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)