我需要做这样的事情(在MySQL中),我使用UNION的尝试直到现在才起作用。
理论上:
SELECT * FROM
tableA A
JOIN tableB B ON A.tableAId = B.tableAId
LEFT JOIN tableC C ON C.tableAId = A.tableAId
LEFT JOIN tableD D ON D.tableAId = A.tableAId
JOIN tableE E
ON (C.tableEId = E.tableEId OR D.tableEId = E.tableEId)
预期结果是A与B交叉,可选C与A交叉,可选D与A交叉,如果id在C或D上,则得到E结果。
为了知道找到的记录是来自C还是D,我使用了if检查tableCId还是tableDId是否为空。
最佳答案
我想你的代码会起作用的。
SELECT *
FROM tableA A JOIN
tableB B
ON A.tableAId = B.tableAId LEFT JOIN
tableC C
ON C.tableAId = A.tableAId LEFT JOIN
tableD D
ON D.tableAId = A.tableAId JOIN
tableE E
ON E.tableEId IN (C.tableEId, D.tableEId);
这将过滤掉C和D中没有匹配项的行,以及C/D中匹配项不在E中的行。我认为这是可取的。
此外,
OR
和IN
可能会对JOIN
性能产生不良影响,但您不会将性能作为关注点。