我试图在Oracle数据库上执行查询。
我的表结构是:
我使用以下查询:
SELECT o.id ID, ROWNUM rn /*row 1*/
FROM TABLE_D d
LEFT JOIN TABLE_O o ON d.O_ID=o.ID
RIGHT JOIN TABLE_R r ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE' /*row 4*/
RIGHT JOIN TABLE_MTM mtm ON o.ID = mtm.ORD_ID /*row 5-6*/
RIGHT JOIN TABLE_M m ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/
WHERE o.ACTIVE=0
ORDER BY o.SOME_COL ASC;
(这只是我完整查询的一小部分;是的,我确实需要ROWNUM,' d'表,以及所有内容)
谁能告诉我我失踪了什么?
更新: 一切都适用于Oracle 12c。 在10g上无法正常工作。
答案 0 :(得分:1)
你遗失了很多东西:
SELECT o.id ID, ROWNUM as rn /*row 1*/
FROM TABLE_D d LEFT JOIN
TABLE_O o
ON d.O_ID = o.ID AND o.ACTIVE = 0 LEFT JOIN
TABLE_R r
ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE' LEFT JOIN /*row 4*/
TABLE_MTM mtm
ON o.ID = mtm.ORD_ID LEFT JOIN /*row 5-6*/
TABLE_M m
ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/
ORDER BY o.SOME_COL ASC;
首先,对于LEFT JOIN
, second 表中的条件应该在ON
子句中而不是WHERE
子句中。其次,对于RIGHT JOIN
, first 表中的条件应该在ON
子句中。 second 表(对于RIGHT JOIN
)的条件不会过滤行。
在任何情况下,您都不应在同一查询中混合使用LEFT JOIN
和RIGHT JOIN
,除非您确实知道自己在做什么并且确实需要它。我怀疑LEFT JOIN
和上面的结构应该是正确的。