在 SELECT 子句中使用子查询,将 table 连接到自身

Using a subquery in SELECT clause with a join of a table to itself

尝试在 SELECT 子句中创建子查询(使用 Oracle 11g)。子查询包括一个 table 到自身的连接。我收到一条 "ORA-01427: single-row subquery returns more than one row" 错误消息(我最大的敌人...)。这是我的代码:

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

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

谢谢!

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

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

您必须确保查询

(select some value from table where..)

returns最多1行。如果 returns 多于 1 行,您将得到 ora-01427 异常。

我认为问题是,假设您的子查询 returns 每行 isbn 一行,您没有包含 isbn table 和您的子查询之间的相关性。

你应该做类似的事情(在这里猜测,因为我们不知道你的 table 结构):

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