具有多个联接的Oracle ROWNUM

时间:2016-07-18 14:58:24

标签: sql oracle join rownum right-join

我试图在Oracle数据库上执行查询。

我的表结构是:

  • d - o一对一
  • o - r one-to-many
  • o - m many-to-many(via mtm)

我使用以下查询:

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'表,以及所有内容)

  • 如果我运行此查询,则不会返回任何结果。
  • 如果从SELECT中删除ROWNUM,则返回结果
  • 如果我删除第4行,则返回结果
  • 如果我删除第5行和第6行,则返回结果。

谁能告诉我我失踪了什么?

更新:   一切都适用于Oracle 12c。   在10g上无法正常工作。

1 个答案:

答案 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 JOINRIGHT JOIN,除非您确实知道自己在做什么并且确实需要它。我怀疑LEFT JOIN和上面的结构应该是正确的。

相关问题