可以在sql ON子句上使用IN

时间:2014-09-09 15:34:23

标签: mysql sql

可以在使用MySQL的sql ON子句上使用IN吗?如果是这样的话,这样做是否被认为是不好的做法?是否有任何理由不做OR或IN,而是将t3和t2两次加入t3?

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;

2 个答案:

答案 0 :(得分:1)

你的三个问题不会做同样的事情。

前两个是等效的,使用in没有问题。我发现on子句使用in子查询很难理解,但只有一个值或列的列表,它们通常比等效的or构造更具可读性。

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

答案 1 :(得分:1)

仅使用MySQL docs

回答您的问题
  

conditional_expr一起使用的ON的任何条件表达式   可以在WHERE子句中使用的表单。通常,您应该使用。{   ON子句用于指定如何连接表的条件,以及   WHERE子句用于限制结果集中所需的行。

考虑到使用IN作为可接受的做法主要是基于意见的,不能简洁地回答。我没有看到它的问题,但也不会争论它的使用。