1

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 は選択できません。

4

2 に答える 2

1

このことを考慮。これを実行して確認する方法はありません。だから、どんな問題でも私に知らせてください

   SELECT m.pk_1, m.pk_2, m.fld_3, C.PK1
   FROM MASTER_TAB M, CHILD_TAB C
   WHERE c.pk_1 = m.pk_1 AND m.pk_1 = '018'
   AND    m.pk_2 = 'value'
   AND EXISTS
   (
   SELECT *
   FROM CHILD_TAB C2
   c2.pk_1 = m.pk_1
   HAVING COUNT(*) = 1
   )

編集:

   SELECT m.pk_1, m.pk_2, m.fld_3, C.PK1
   FROM MASTER_TAB M, (
   SELECT c2.pk_1
   FROM CHILD_TAB C2
   HAVING COUNT(*) = 1
   ) C
   WHERE c.pk_1 = m.pk_1 AND m.pk_1 = '018'
   AND    m.pk_2 = 'value'
于 2013-04-03T09:44:19.270 に答える