سؤال

أحاول ضم بعض البيانات معًا من جدولين، ولكن في عدة أعمدة.هنا مثال:

مصدر طاولة

رقم | ديسك | آآآ BBBB |

الجدول 2 طاولة

رقم | النص| ID1 | ID2 | ID3 |

حيث ID1، ID2 وID3 في الجدول 2 هي معرفات من مصدر طاولة

أود إجراء استعلام يعطي النتائج:

Table2.Text,
Source.Desc(ID1),
Source.AAAA(ID1),
Source.Desc(ID2),
Source.AAAA(ID2),
Source.Desc(ID3),
Source.AAAA(ID3)

أعتقد أن هذا سيكون انضمامًا، لكن لا يمكنني فهم بناء الجملة بشكل صحيح ...أم سأكون أفضل حالا مع الاتحاد؟

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

المحلول

إذا لم تتم تعبئة جميع الجداول المصدر في الجدول 2، فسيظل هذا يعطيك نتائج جزئية:

SELECT
    t.Desc, s1.Desc, s1.AAAAA, s2.Desc, s2.AAAAA, s3.Desc, s3.AAAA
    FROM Table2                t
        LEFT OUTER JOIN Source s1 ON t.ID1 = s1.ID
        LEFT OUTER JOIN Source s2 ON t.ID2 = s2.ID
        LEFT OUTER JOIN Source s3 ON t.ID3 = s2.ID
    WHERE t.ID=@YourIDHere

نصائح أخرى

يمكنك فقط استخدام صلات متعددة، أليس كذلك؟على سبيل المثال:

SELECT tb.Desc, s1.Desc, s1.AAAAA, s2.Desc, s2.AAAAA, s3.Desc, s3.AAAA
FROM Table2 tb
    INNER JOIN Source s1 ON tb.ID1 = s1.ID
    INNER JOIN Source s2 ON tb.ID2 = s2.ID
    INNER JOIN Source s3 ON tb.ID3 = s2.ID

تحتاج إلى الانضمام إلى الجدول المصدر ثلاث مرات، واحدة لكل معرف.يمكنك أيضًا تجربة unuion لمعرفة أيهما أفضل أداءً.

هذا تصميم جدول سيء (يجب تطبيعه) وأقترح عليك تغييره الآن إذا كان ذلك ممكنًا.يجب أن يكون هناك جدول مرتبط بكل معرف في سجل منفصل، ثم يمكنك الانضمام مرة واحدة وسيكون الأمر أكثر كفاءة وأسهل بكثير لكتابة التعليمات البرمجية مقابله ولن تضطر إلى تغيير بنية الجدول وجميع الاستعلامات في اليوم الذي تحتاجه معرف4.

ثلاث صلات يجب أن تقوم بالخدعة:

select A.*, coalesce(B1.Text,B2.Text,B3.Text,'') as Text
from Source A
inner join Table2 B1 on B1.ID1=A.ID
inner join Table2 B2 on B2.ID2=A.ID
inner join Table2 B3 on B3.ID3=A.ID
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top