0

Oracleでクエリがあります。このクエリの結果は、親テーブルの「子」テーブルのリストになります。

WITH tempTab AS
 (SELECT owner          ,
         constraint_name,
         table_name
 FROM    sys.all_constraints
 WHERE   owner           = 'PARENT_OWNER'
 AND     table_name      = 'PARENT_TABLE'
 AND     constraint_type = 'P'
 )
 ,
 acTemp AS
 (SELECT DISTINCT ac.owner                       AS child_owner,
                                   ac.table_name AS child_table,
                                   ac.constraint_name
                  FROM             sys.all_constraints ac,
                                   tempTab tt
                  WHERE            ac.constraint_type   = 'R'
                  AND              ac.r_constraint_name = tt.constraint_name
 )
SELECT act.child_owner,
   act.child_table
FROM   acTemp act

そして、それは適切に機能します(いくつかの行を取得します)。しかし、このクエリの最後の数行 (最後の SELECT) を変更すると、次のようになります。

WITH tempTab AS
 (SELECT owner          ,
         constraint_name,
         table_name
 FROM    sys.all_constraints
 WHERE   owner           = 'PARENT_OWNER'
 AND     table_name      = 'PARENT_TABLE'
 AND     constraint_type = 'P'
 )
 ,
 acTemp AS
 (SELECT DISTINCT ac.owner                       AS child_owner,
                                   ac.table_name AS child_table,
                                   ac.constraint_name
                  FROM             sys.all_constraints ac,
                                   tempTab tt
                  WHERE            ac.constraint_type   = 'R'
                  AND              ac.r_constraint_name = tt.constraint_name
 )
SELECT act.child_owner,
   act.child_table
FROM   acTemp act ,
   acTemp act2,
   tempTab tt
WHERE  tt.owner      = act2.child_owner
AND    tt.table_name = act2.child_table

行がありません。なんで?2 番目のクエリでは act テーブルをフィルター処理しないため、結果は最初のクエリと同じになるはずですが、そうではありません。

4

1 に答える 1

0

次のようなことを試してください:

SELECT
     parent_table.owner
    ,parent_table.table_name AS parent_table
    ,child_table.table_name AS child_table
    ,parent_table.constraint_name AS constraint_name
FROM sys.all_constraints parent_table
INNER JOIN sys.all_constraints child_table ON ( child_table.constraint_name = parent_table.r_constraint_name AND child_table.owner = parent_table.owner)
WHERE parent_table.owner = 'PARENT_OWNER'
AND parent_table.table_name = 'PARENT_TABLE'
AND parent_table.constraint_type = 'R';
于 2013-02-06T12:35:10.097 に答える