mysql - IN 可以用在 sql ON 子句上

标签 mysql sql

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 子句很难理解,但是只有一个值或列的列表,它们通常比等效的 构造。

但是,第三个不同。首先,它有更多的列 - 每行都有 t3at3b 的所有列。前两个只有一组来自 t3 的列。并且,如果两个 id 都匹配,则每个匹配的前两行都会返回。第二个仅返回一行(对于单个匹配)。

关于mysql - IN 可以用在 sql ON 子句上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748643/

相关文章:

MySQL 按优先级列表排序

php - cakephp 使用 Between 进行高级过滤

PHP:虽然循环只运行一次,但应该运行多次

mysql - SQL:查询多个表,仅查询一个表的最新结果,查询另一个表的所有结果

sql - "campaign_$"是 SQL 列的错误名称吗?

SQL Server 将列转换为行

mysql - 在键上插入多个更新这些多个

php - 在 MySQL 和 PHP 中查询数据库中的所有表

mysql - 无法批量导入数据到mysql

sql - 如何在 QuestDB 中进行月度/季度聚合?