Oracle SQL 相関サブクエリでは、
正確に 1 行をフェッチするには、サブクエリに条件を設定する必要があります (複数の行がある場合は、行をフェッチしないでください)。
そして、以下のクエリは問題なく機能します。ただし、同じテーブルを 2 回クエリする必要があります。
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 を生成することです。また、選択するデータはキーに限定されません。また、必要なのは SQL ソリューションだけなので、PLSQL は選択できません。