Mysql 如何基于条件在两个表之间进行连接?

Mysql 如何基于条件在两个表之间进行连接?,mysql,sql,join,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发生在这两种情况下: 当A.name为空时,则B.name ELSE A.name 我想避免这种情况。我的意思是,我只想在a.name为NULL的情况下进行连接(我的目的是避免无用的连接)。

我有一个疑问:

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
发生在这两种情况下:

  • 当A.name为空时,则B.name
  • ELSE A.name

我想避免这种情况。我的意思是,我只想在a.name为NULL的情况下进行
连接
(我的目的是避免无用的连接)。我怎样才能做到这一点呢?

我不确定这是否会更有效,但从技术上讲,使用
相关子查询将删除额外的
连接:

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
;

编辑:仔细想想,在非常大的数据集上,这可能是有帮助的;但即使如此,在这种情况下,您也不太可能选择整个表内容。

一个简短的问题,当
name为NULL时,将执行子查询
不是真的吗?我的查询中的
连接
又如何?当
name为NULL
为非真时它会被执行吗?你所说的“无用的加入”到底是什么意思?我的意思是如果
A.name为NULL
为非真,那么我就不需要加入
了。。在
on
子句中添加
A.name为NULL
在某种程度上是聪明的。。非常感谢。坦白说,我不喜欢你的第二个问题。我只想知道,你会选择哪一个?你的第一个问题?你的第二个问题?问题中的我的查询?@stack就像我在第一句话中说的那样,根据MySQL查询优化器的处理方式,添加该条件可能不会阻止行比较,而是为每个行比较添加一个额外的操作。@在问题中堆叠原始查询。在大多数情况下,试图避免“不必要的连接”的成本可能比正常进行连接要高。第二个问题是在我在“编辑”说明中概述的情况下实际可能有益的唯一方法
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)