oracle join use + subquery: ora-00904 string: invalid exerial
سؤال
أنا أواجه مشكلة صغيرة في استفساري (مبسطة):
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)
باستخدام الكلمة الرئيسية "باستخدام" ، لا يسمح 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)
هذا الاستعلام لن يعطي النتائج المتوقعة.
ولكن بما أنني أستخدم اسم "موجود" ، كيف يمكنني الانضمام إلى هذه الاستماع الفرعي؟
بالطبع ، أفترض أنه يمكنني كتابة هذا الاستعلام بطريقة أخرى وتجنب وجوده ، أو لم أستطع استخدام "استخدام".
ولكن هل من الممكن أن يكون "الانضمام / استخدام" جنبًا إلى جنب مع مساع فرعي في الفقرة؟
تحرير: استخدام 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
.
فقط استخدم صريحًا 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
)