في SQL، هل يمكنني استخدام متغير محدد النطاق خارج التحديد المتداخل داخل التحديد المتداخل نفسه؟
سؤال
أحاول تشغيل عبارة 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 نفس القيد؟