ORA-00904文字列:無効な識別子をOracleが+サブクエリを使用して結合します

StackOverflow https://stackoverflow.com/questions/1797778

質問

iがm(簡体字)私のクエリではほとんどの構文問題を抱えてます:

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)

:(t1.pk1、唯一PK1を使用することができるなど)、キーワード、オラクル「を使用する」カラム名の前にテーブル識別子を許すdoesntの使用により、

私が書く場合:

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)

このクエリは期待通りの結果が得られません。

しかし、私は使用しておりますので、「存在する」サブクエリ、私はこのサブクエリに参加できますか?

もちろん、私はこのクエリに別の方法を書いて、存在する、または私は「使って」使用することができませんでし避けることができたとします。

しかし、「使用して参加/」持っていることも可能であるwhere句?

のサブクエリと組み合わせ

編集:使用して、Oracle 10gR2の

役に立ちましたか?

解決

興味深い問題!私はまだ使用した使用中に管理することができる最高のは、次のとおりです。

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)

他のヒント

あなたは自然が参加します。

と、テーブルの修飾子を使用することはできません

このクエリます:

select 1 from table4 t4 where t4.pk1 = pk1

のように解析されています
select 1 from table4 t4 where t4.pk1 = t4.pk1
NOT EXISTSで単一のレコードがあるものの場合、それ以上の

table4は常にfalseを返します。

ただ、明示的な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
        )
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top