在 Oracle SQL 相关子查询中,
我需要在子查询上有一个条件来准确地获取一行(如果有更多行,它不应该获取任何行)。
下面的查询工作得很好。但它涉及两次查询同一张表。
SELECT m.pk_1
,m.pk_2
,m.fld_3
,(SELECT c.pk_1
FROM child_tab c
WHERE (SELECT COUNT(*)
FROM child_tab c2
WHERE c2.pk_1 = m.pk_1
AND rownum <= 2) = 1
AND c.pk_1 = m.pk_1) c_pk_1
FROM master_tab m
WHERE m.pk_1 = '018'
AND m.pk_2 = 'value'
通过使用解析函数重新设计子查询,下面的查询给出了错误
SELECT m.pk_1
,m.pk_2
,m.fld_3
,(SELECT ch.pk_1
FROM (SELECT COUNT(*) over() cnt
,c.pk_1
FROM child_tab c
WHERE c.pk_1 = m.pk_1
AND rownum <= 2) ch
WHERE cnt = 1
AND c.pk_1 = m.pk_1) c_pk_1
FROM master_tab m
WHERE m.pk_1 = '018'
AND m.pk_2 = 'value'
ORA-00904 m.pk_1 is an invalid identifier
使用 Oracle SQL 有没有更好的方法来做到这一点?
更新
我真正的要求是我将这个 SQL 生成为一个递归过程,它会导致很多这样的级别。而且我选择的数据不会局限于key。我只需要 SQL 解决方案,所以 PLSQL 不是一个选择。