Select 在 Oracle 中使用 rownum 的记录与嵌套子查询导致无效标识符错误

Select record using rownum in Oracle with nested subquery resulting invalid identifier error

以下查询给出了无效标识符错误 (a.id),因为它在嵌套子查询中:

SELECT a.*, 
CASE WHEN
SELECT id FROM (SELECT id, ROWNUM rnum FROM US b WHERE b.id = a.id ORDER BY b.createdate ASC) WHERE rnum = 2) = 21 THEN ‘Found’
END SEARCH
FROM EU a 
JOIN US b ON b.id = a.id;

任何人都可以建议我替代方法吗?

您没有详细描述您的设置或您想要实现的目标,但这会解决问题吗?

SQL Fiddle

Oracle 11g R2 模式设置:

CREATE TABLE EU ( id ) AS
SELECT 19+LEVEL
FROM   DUAL CONNECT BY LEVEL <= 5;

CREATE TABLE US ( id, createdate ) AS
SELECT 19+LEVEL, SYSDATE - LEVEL
FROM   DUAL CONNECT BY LEVEL <= 5
UNION ALL
SELECT 19+2*LEVEL, SYSDATE-LEVEL-5
FROM   DUAL CONNECT BY LEVEL <= 3;

查询 1:

SELECT a.*,
       CASE WHEN a.id = 21
             AND ROW_NUMBER() OVER ( PARTITION BY a.id ORDER BY b.createdate ) = 2
            THEN 'Found'
             END AS SEARCH
FROM   EU a 
JOIN   US b
ON     b.id = a.id

Results:

| ID | SEARCH |
|----|--------|
| 20 | (null) |
| 21 | (null) |
| 21 |  Found |
| 22 | (null) |
| 23 | (null) |
| 23 | (null) |
| 24 | (null) |

您的查询的一个问题是在第二个 SELECT 之前缺少括号。我仍然认为它行不通,因为 Oracle 将标识符的范围限制在一层深度。但这就是我认为你想要的:

SELECT a.*, 
       (CASE WHEN (SELECT id
                   FROM (SELECT id, ROWNUM as rnum
                         FROM US b
                         WHERE b.id = a.id
                         ORDER BY b.createdate ASC
                        )
                   WHERE rnum = 2
                  ) = 21 THEN ‘Found’
        END) SEARCH
FROM EU a JOIN
     US b
     ON b.id = a.id;

获得所需内容的最简单方法是使用 row_number():

select a.*,
       (case when b.id = 21 then 'Found' end) as Search
from eu a left join
     (select b.*,
             row_number() over (partition by b.id order by b.createddate) as seqnum
      from us b
     ) b
     on b.id = a.id
where seqnum = 2;

查询看起来很奇怪,因为 id 用于所有内容。您似乎在寻找 ID 为 21 的两条记录。