【问题标题】:Using a subquery in SELECT clause with a join of a table to itself在 SELECT 子句中使用子查询并将表连接到自身
【发布时间】:2015-03-05 12:56:16
【问题描述】:

尝试在 SELECT 子句中创建子查询(使用 Oracle 11g)。子查询包括一个表到自身的连接。我收到“ORA-01427:单行子查询返回多行”错误消息(我最大的敌人......)。这是我的代码:

SELECT e.ISBN,
(SELECT p2.PAGE_NUMBERS FROM PAGE_NUMBERS_TABLE p1 INNER JOIN PAGE_NUMBERS_TABLE p2
    ON p1.TITLE_CODE = p2.TITLE_CODE
    AND p2.FORMAT_CODE = 'HB'
    WHERE p1.FORMAT_CODE = 'OC') AS "Page Numbers"
    FROM ISBN_TABLE e

希望这是有道理的,如果没有意义,我可以进一步澄清我在这里要做的事情。

谢谢!

【问题讨论】:

  • 问题是子查询为每个原始查询行返回多行。要解决此问题,您可以在子查询中使用 max(p2.PAGE_NUMBERS),这将消除错误,但不会给您预期的结果,因此,如果您告诉我们您到底想要做什么,也许我们可以帮助你
  • 啊,我明白了 - 是的,添加 MAX 会为所有行提供“6496”,我假设这是整个数据集中的最大值。当我正在寻找构建原始查询时,我已经在stackoverflow.com/questions/28612074/… 上进行了解释,现在我正在尝试将其作为子查询嵌套在 select 语句中。如果我需要进一步澄清,请告诉我!

标签: oracle join subquery


【解决方案1】:

我认为问题在于,假设您的子查询为每个 isbn 行返回一行,那么您没有包含 isbn 表和子查询之间的相关性。

你应该这样做(在这里猜测,因为我们不知道你的表结构):

SELECT e.ISBN,
(SELECT p2.PAGE_NUMBERS FROM PAGE_NUMBERS_TABLE p1 INNER JOIN PAGE_NUMBERS_TABLE p2
    ON p1.TITLE_CODE = p2.TITLE_CODE
    AND p2.FORMAT_CODE = 'HB'
    WHERE p1.FORMAT_CODE = 'OC'
    and    e.title_code = p1.title_code -- change this to whatever condition correlates the table and subquery!
    ) AS "Page Numbers"
    FROM ISBN_TABLE e

或者,您可以将其重写为连接并将子查询与连接条件一起放在 from 子句中,例如。有点像:

SELECT e.ISBN,
       pg.page_numbers AS "Page Numbers"
FROM   ISBN_TABLE e
       inner join (SELECT p2.PAGE_NUMBERS,
                          p1.title_code -- don't forget to include the join column(s)!
                   FROM   PAGE_NUMBERS_TABLE p1
                          INNER JOIN PAGE_NUMBERS_TABLE p2
                            ON p1.TITLE_CODE = p2.TITLE_CODE
                   AND    p2.FORMAT_CODE = 'HB'
                   WHERE  p1.FORMAT_CODE = 'OC') pg
         on (e.title_code = pg.title_code) -- or whatever the join condition is

【讨论】:

  • 太棒了,谢谢,你描述的相关问题解决了(你描述的方式 e.title_code = p1.title_code 是准确的)!
【解决方案2】:

您正在做的是使用查询选择列值。

select column1,
       (select some value from table where..) column2
from table

您必须确保查询

(select some value from table where..)

最多返回 1 行。如果它返回超过 1 行,则会出现 ora-01427 异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2021-11-16
    • 2022-11-12
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多