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 テーブルをフィルター処理しないため、結果は最初のクエリと同じになるはずですが、そうではありません。