ORA-00904文字列:無効な識別子をOracleが+サブクエリを使用して結合します
質問
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
)
所属していません StackOverflow