繁体   English   中英

可以在sql ON子句上使用

[英]can IN be used on a sql ON clause

可以在使用MySQL的sql ON子句上使用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使用没有问题。 我发现on使用条款in使用子查询是很难理解的,但只是一个值或列的列表中,他们往往更具有可读性,则相当于or构造。

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

要简单地从MySQL文档回答您的问题:

ON使用的conditional_expr可以在WHERE子句中使用的任何形式的条件表达式。 通常,应将ON子句用于指定如何联接表的条件,并使用WHERE子句限制结果集中所需的行。

IN的使用视为可接受的做法主要是基于观点的,不能简单地回答。 我没有看到任何问题,但也不会为它的使用而争论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM