IN 可以用在使用 MySQL 的 SQL ON 子句上吗?如果是这样,这样做是否被认为是不好的做法?是否有任何理由不执行 OR 或 IN,而是将 t3 两次连接到 t1 和 t2?
SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t2.t1_id=t1.id
LEFT OUTER JOIN t3 ON t3.fk=t1.id OR t3.fk=t2.id
WHERE t3.id=123;
SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t2.t1_id=t1.id
LEFT OUTER JOIN t3 ON t3.fk IN (t1.id,t2.id)
WHERE t3.id=123;
SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t2.t1_id=t1.id
LEFT OUTER JOIN t3 AS t3a ON t3a.fk=t1.id
LEFT OUTER JOIN t3 AS t3b ON t3b.fk=t2.id
WHERE t3a.id=123 OR t3b.id=123;
最佳答案
您的三个查询不会执行相同的操作。
前两者是等价的,使用in
没有问题。我确实发现使用 in
和子查询的 on
子句很难理解,但是只有一个值或列的列表,它们通常比等效的 或
构造。
但是,第三个不同。首先,它有更多的列 - 每行都有 t3a
和 t3b
的所有列。前两个只有一组来自 t3
的列。并且,如果两个 id
都匹配,则每个匹配的前两行都会返回。第二个仅返回一行(对于单个匹配)。
关于mysql - IN 可以用在 sql ON 子句上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748643/