سؤال

أنا أواجه مشكلة صغيرة في استفساري (مبسطة):

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
        )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top