في SQL، هل يمكنني استخدام متغير محدد النطاق خارج التحديد المتداخل داخل التحديد المتداخل نفسه؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

أحاول تشغيل عبارة SQL التالية:

UPDATE myschema.tableA update_tableA
   SET field_id = 
   ( SELECT src.field_id 
         FROM myschema.srcTable src
         INNER JOIN myschema.tableB tableB ON 
            update_tableA.id = tableB.id 
            AND SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE' );

عندما أقوم بتشغيل هذا البيان، أحصل على الخطأ التالي:

ORA-00904: "UPDATE_TABLEA"."ID": invalid identifier

هل لا يمكنني استخدام متغير محدد النطاق خارج التحديد المتداخل داخل التحديد المتداخل؟أي أفكار؟

ملاحظة.المعرف صالح بالفعل في جدول قاعدة البيانات.يبدو أن المشكلة تتعلق بالنطاق، ولكنني أريد التأكد من أن هذه مشكلة بالفعل.

هل كانت مفيدة؟

المحلول

وأنا لا أعتقد أنك يمكن JOIN على عمود (أي استخدامه في بند ON) هذا ليس في أحد الجداول التي انضمت. المسندات إضافية يجب أن تكون في جملة WHERE.

وجرب هذا:

UPDATE myschema.tableA update_tableA
   SET field_id = 
   ( SELECT src.field_id 
         FROM myschema.srcTable src
         INNER JOIN myschema.tableB tableB ON 
           SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE'
        WHERE update_tableA.id = tableB.id 
   );

نصائح أخرى

وإذا نظرنا إلى SQL أعلاه، هنا هو ما أفكر

1) myschema.tableA لم يكن لديك عمود معرف (أنه يمكن FIELD_ID)
2) SELECT لا يبدو أن توفر شرط الربط

و SELECT src.field_id FROM myschema.srcTable src INNER JOIN myschema.tableB tableB ON

وأين هو شرط للانضمام SRC مع tableB؟

والحقول من التحديث يمكن استخدامها في تحديد متداخلة كما يمكن أن يرى مع الاختبار التالي:

drop table test;
create table test as (select 1 key, 'a' value from dual);
insert into test values (2,'b');
select * from test;
update test t1 
   set value = (select 'c' from dual where t1.key=2);
select * from test;

ولست متأكدا من السبب في أنه لا يعمل في هذه الحالة. يبدو مثل الانضمام صريحة مع TableA قد تكون ضرورية.

يجب أن أعترف أنني لست على دراية بـ Oracle، لكني أتعرض للضرب بشكل أو بآخر بواسطة لهجة SQL الخاصة بـ SQL Server.وفي المرة الأخيرة التي بحثت فيها، كانت لهجة SQL هذه لا تسمح بتحديد اسم مستعار للجدول المراد تحديثه في عبارة UPDATE.أي.في SQL Server، المعرف update_tableA.id سيكون غير قانوني.هل من الممكن أن يكون لدى Oracle نفس القيد؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top