可以在使用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;
答案 0 :(得分:1)
你的三个问题不会做同样的事情。
前两个是等效的,使用in
没有问题。我发现on
子句使用in
子查询很难理解,但只有一个值或列的列表,它们通常比等效的or
构造更具可读性。
t3a
和t3b
的所有列。前两个只有t3
中的一组列。并且,如果两个id
匹配,则每个匹配的前两个返回行。第二个只返回一行(对于一个匹配)。
答案 1 :(得分:1)
仅使用MySQL docs:
回答您的问题与
conditional_expr
一起使用的ON
是的任何条件表达式 可以在WHERE
子句中使用的表单。通常,您应该使用。{ON
子句用于指定如何连接表的条件,以及WHERE
子句用于限制结果集中所需的行。
考虑到使用IN
作为可接受的做法主要是基于意见的,不能简洁地回答。我没有看到它的问题,但也不会争论它的使用。