البحث عن كافة الصلات المطلوبة للانضمام إلى جدول برمجياً

dba.stackexchange https://dba.stackexchange.com/questions/101444

سؤال

بالنظر إلى SourceTable وTargetTable، أرغب في إنشاء سلسلة بكل الصلات المطلوبة برمجيًا.

باختصار، أحاول إيجاد طريقة لإنشاء سلسلة مثل هذا:

FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn

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

SELECT 
    p.name AS ParentTable
    ,pc.name AS ParentColumn
    ,r.name AS ChildTable
    ,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id 
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id

أنا متأكد من أن هذا قد تم القيام به من قبل، ولكن يبدو أنني لا أستطيع العثور على مثال.

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

المحلول

كان لدي برنامج نصي يقوم بإصدار بدائي من اجتياز المفتاح الأجنبي.قمت بتكييفها بسرعة (انظر أدناه)، وقد تكون قادرا على استخدامها كنقطة انطلاق.

نظرا لجدول الهدف، يحاول البرنامج النصي طباعة سلسلة الانضمام لأقصر المسار (أو أحدها في حالة العلاقات) لجميع جداول المصدر المحتملة بحيث يمكن اجتياز مفاتيح الأعمدة الفردية للوصول إلى الهدفالطاولة.يبدو أن البرنامج النصي يعمل بشكل جيد في قاعدة البيانات باستخدام زوجين ألف طاولات والعديد من اتصالات FK التي جربتها عليها.

كما ذكر آخرون في التعليقات، كنت بحاجة إلى جعل هذا أكثر تعقيدا إذا كنت بحاجة إلى التعامل مع مفاتيح أجنبية متعددة العمود.أيضا، يرجى العلم أن هذا ليس بأي شكل رمز جاهز للإنتاج والاختبار بالكامل.آمل أن تكون نقطة انطلاق مفيدة إذا قررت بناء هذه الوظيفة!

giveacodicetagpre.

نصائح أخرى

يمكنك وضع قائمة مفاتيح الجدول مع حقلين tab_name ، key_name لجميع الجداول التي تريد توصيلها.

على سبيل المثال، للجدول City

  • المدينة|اسم_المدينة
  • المدينة|اسم_البلد
  • المدينة|اسم_المقاطعة
  • المدينة|رمز_المدينة

على نفس المنوال Province و Country.

جمع البيانات للجداول ووضعها في جدول واحد (على سبيل المثال.جدول البيانات الوصفية)

الآن قم بصياغة الاستعلام كما هو موضح أدناه

select * from
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) A,
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) B,
(Select Table_name,Key_name from Meta_Data 
where Table_name in ('City','Province','Country')) C

where

A.Table_Name <> B.Table_name and
B.Table_name <> C.Table_name and
C.Table_name <> A.Table_name and
A.Column_name = B.Column_name and
B.Column_name = C.Column_name

سيوضح لك هذا كيف يمكنك ربط الجداول بناءً على المفاتيح المطابقة (نفس أسماء المفاتيح)

إذا كنت تعتقد أن اسم المفاتيح قد لا يتطابق، فيمكنك تضمين حقل مفتاح بديل ومحاولة استخدامه في حالة المكان.

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