4

私のクエリで構文の問題が少しあります(簡略化):

select *
from table1 t1
inner join table2 t2 using (pk1)
inner join table3 t3 using (pk2)
where not exists (select1 from table4 t4 where t4.pk1 = t1.pk1)

「using」キーワードを使用することにより、Oracleは列名の前にテーブル識別子を許可しません(例:t1.pk1、pk1のみを使用できます)

私が書いた場合:

select *
from table1 t1
inner join table2 t2 using (pk1)
inner join table3 t3 using (pk2)
where not exists (select1 from table4 t4 where t4.pk1 = pk1)

このクエリでは、期待した結果は得られません。

しかし、「exists」サブクエリを使用しているので、このサブクエリに参加するにはどうすればよいですか?

もちろん、このクエリを別の方法で記述して存在を回避できるか、「using」を使用できないと思います。

しかし、where句で「join / using」をサブクエリと組み合わせることは可能ですか?

編集:Oracle10gR2を使用

4

2 に答える 2

3

面白い問題!USINGを使用しながら管理できる最善の方法は、次のとおりです。

select * from
( select *
  from table1 t1
  inner join table2 t2 using (pk1)
  inner join table3 t3 using (pk2)
) v
where not exists (select1 from table4 t4 where t4.pk1 = v.pk1)
于 2009-11-25T17:53:54.390 に答える
1

自然結合でテーブル修飾子を使用することはできません。

このクエリ:

select 1 from table4 t4 where t4.pk1 = pk1

として解析されています

select 1 from table4 t4 where t4.pk1 = t4.pk1

NOT EXISTSレコードが1つしかない場合は、常にfalseを返しますtable4

明示的なJOIN条件を使用するだけです。

WITH    table1 AS
        (
        SELECT  1 AS pk1
        FROM    dual
        ),
        table2 AS
        (
        SELECT  1 AS pk1, 1 AS pk2
        FROM    dual
        ),
        table3 AS
        (
        SELECT  1 AS pk2
        FROM    dual
        ),
        table4 AS
        (
        SELECT  2 AS pk1
        FROM    dual
        )
SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.pk1 = t1.pk1
JOIN    table3 t3
ON      t3.pk2 = t2.pk2
WHERE NOT EXISTS
        (
        SELECT  1
        FROM    table4 t4
        WHERE   t4.pk1 = t1.pk1
        )
于 2009-11-25T15:55:21.353 に答える