【问题标题】:Oracle ROWNUM with multiple joins具有多个连接的 Oracle ROWNUM
【发布时间】:2016-07-18 14:58:24
【问题描述】:

我正在尝试对 Oracle 数据库执行查询。

我的表结构是:

  • d--o 一对一
  • o--r 一对多
  • o--m 多对多(通过 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 行将表别名“d”作为 ROWNUM 的前缀?
  • ROWNUM 不是表的列。

标签: sql oracle join rownum right-join


【解决方案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 JOINsecond 表上的条件应该在ON 子句而不是WHERE 子句中。其次,对于RIGHT JOINfirst 表上的条件应该在ON 子句中。 second 表上的条件(对于 RIGHT JOIN)不过滤行。

无论如何,你不应该在同一个查询中混合LEFT JOINRIGHT JOIN,除非你真的知道你在做什么并且你真的需要它。我怀疑LEFT JOIN 和上面的构造应该是正确的。

【讨论】:

  • 感谢您的回答。我非常感谢最佳实践建议,但我仍然不知道为什么会发生这种情况。
  • @JakabfiAttila 。 . .这可能是因为没有行有o.ACTIVE = 0,尽管左右连接的组合很难遵循,所以可能还有其他一些情况。
猜你喜欢
  • 2019-03-24
  • 2021-05-29
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2011-08-15
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多