كيف تضع الحرفية في النتيجة مجموعة نتائج SQL استنادًا إلى الجدول الذي تم ربطه لإنشاء الصف؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

لدي 3 جداول ، واحدة تمثل "supertype" ، مع عمود معرف. هناك جدولين آخرين هما كل نوع فرعي ، مع عمود معرف يمثل مفتاحًا خارجيًا لجدول SuperType ، بالإضافة إلى عمود خاص بالأنواع الفرعية.

أريد استعلامًا يرجع جميع البيانات ، وكذلك عمود يمكنني استخدامه كمتميّز يخبرني ما هو الجدول الذي جاء منه الصف.

لذا ، على سبيل المثال ، كيف يمكنني تعديل هذا:

SELECT * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID

الذي يعيدني هذا:

ID    SUB_COL_1  SUB_COL_2
====  =========  =========
0001  value x    NULL
0002  value y    NULL
0003  NULL       value z

في شيء سيضيف عمود تمييز مع بعض القيم الحرفية المرمزة ، مثل هذا:

ID    DISCRIMINATOR  SUB_COL_1  SUB_COL_2
====  =============  =========  =========
0001  SUBTYPE_1      value x    NULL
0002  SUBTYPE_1      value y    NULL
0003  SUBTYPE_2      NULL       value z

لا يُسمح لي بتعديل نموذج البيانات بأي شكل من الأشكال. لا يمكنني أيضًا القيام بأي معالجة ما بعد المعالجة عن طريق الاختبار برمجيًا للخلايا الخالية بعد الحقيقة. أحتاج إلى العمل مع الجداول كما هي ، وإنتاج مجموعة النتيجة المحددة الموضحة أعلاه. أنا أستخدم Oracle 11G ، إذا كان ذلك يحدث أي فرق في الإجابة.

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

المحلول

يمكنك إضافة:

CASE IF S1.ID IS NULL THEN 'SUBTYPE_1' ELSE 'SUBTYPE_2' END AS DISCRIMINATOR, 

في بداية الخاص بك SELECT بند.

نصائح أخرى

ربما هذا هو ما تبحث عنه ... قد تضطر إلى إجراء بعض التغييرات لجعلها تعمل على Oracle.

SELECT case coalesce(SUB_COL_1,'') when '' then 'SUBTYPE_2'  else 'SUBTYPE_1' end,  * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID

عادة ما أفعل هذا مع استفسار الاتحاد

Select S.ID, SUBTYPE_1 as DISCRIMINATOR, S1field1 as SUB_COL_1, null as SUB_COL_2  
from SUPER S 
join SUB_1 S1 on S.ID = S1.ID
union all 
Select S.ID, SUBTYPE_2 as DISCRIMINATOR, null as SUB_COL_1, S2.field1 as SUB_COL_2  
from SUPER S 
join SUB_2 S2 on S.ID = S2.ID

من المحتمل أن أضيف المعرف إلى بيانات كل جدول في مساع فرعي قبل الانضمام إليه.

SELECT * from 
    (select *, 'SUPER' as DISCRIMINATOR from SUPER ) S 
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_1 ) S1 
    on S.ID = S1.ID
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_2 ) S2 
    on S.ID = S2.ID
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top