سؤال

وأنا جديدة قليلا إلى SQL وجئت عبر المشكلة التالية.

ولدي جدول مع تفاصيل الشركة على أنها هي التي انضمت إلى جدول اتصال من قبل enqID.

وضمن الجدول الاتصال، هناك 4 أنواع مختلفة من الاتصالات التي قد تكون أو لا تكون إدخالا. يتم التمييز هذه من قبل ctcTypID (1-4)

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

وأعتقد أنه كان يمكن القيام بذلك عن طريق استخدام الاستعلامات الفرعية لكل من اتصالات مختلفة ولكن أنا لا يمكن أن يبدو للحصول على عمل وأنا لا أعرف كيف لكتابة فرعي حدد بند يشير انها الأم حدد الشرط (إذا ترى ما أعنيه!)

هل هذا ممكن حتى؟ كما ذكرت لك، أنا جميلة جديدة لSQL لذا يرجى محاولة لا أن يسخر كثيرا!

شكرا،

وستيف

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

المحلول

وشيء من هذا القبيل (على افتراض كنت تستخدم SQL Server 2005 و حتى - للأسف، أنت لم أذكر أن في مشاركتك الأصلية):

SELECT 
   c.CompanyName,
   c1.ctcTypID, c1.ContactName,
   c2.ctcTypID, c2.ContactName,
   c3.ctcTypID, c3.ContactName,
   c4.ctcTypID, c4.ContactName
FROM
   CompanyTable c
LEFT OUTER JOIN
   ContactTable c1 ON c.enqID = c1.enqID AND c1.ctcTypID = 1
LEFT OUTER JOIN
   ContactTable c2 ON c.enqID = c2.enqID AND c2.ctcTypID = 2
LEFT OUTER JOIN
   ContactTable c3 ON c.enqID = c3.enqID AND c3.ctcTypID = 3
LEFT OUTER JOIN
   ContactTable c4 ON c.enqID = c4.enqID AND c4.ctcTypID = 4

وتحتاج إلى استخدام LEFT OUTER الصلات منذ قد لا يكون هناك تطابق، والقيام بذلك، سوف الاستعلام الخاص بك لا يكون بفظاعة بسرعة من حيث الأداء - ولكن ينبغي لها أن تعمل نأمل

ومارك

نصائح أخرى

وهذا يجب أن تعمل أيضا. يتجنب الانضمام على الطاولة الاتصال عدة مرات.

SELECT 
   CompanyTable.CompanyName,
   MAX(CASE WHEN ContactTable.ctcTypID  = 1 THEN ContactTable.ContactName END) AS ContactName1,
   MAX(CASE WHEN ContactTable.ctcTypID  = 2 THEN ContactTable.ContactName END) AS ContactName2,
   MAX(CASE WHEN ContactTable.ctcTypID  = 3 THEN ContactTable.ContactName END) AS ContactName3,
   MAX(CASE WHEN ContactTable.ctcTypID  = 4 THEN ContactTable.ContactName END) AS ContactName4
FROM CompanyTable,
LEFT JOIN ContactTable 
    ON ContactTable.enqID = CompanyTable.enqID AND ContactTable.ctcTypID  IN (1,2,3,4)
GROUP BY
   CompanyTable.CompanyName

وأعتقد أنك تحاول استخدام SQL عن شيء لم يتم تصميمه ل. SQL هي لغة التي تمكنك من التعامل مع البيانات واستردادها، كنت تحاول استخدام SQL لتنسيق الإخراج من البيانات التي تم استردادها أيضا، وأعتقد أنه لا ينبغي عليك القيام بما يلي:

ويجب عدم محاولة شكل (وضع كل الاتصالات على f.i. صف واحد) البيانات مع SQL. نصيحتي هي: مجرد استخدام أكثر performant للSQL الاستعلام لاسترداد البيانات من قاعدة البيانات، وتنسيق الانتاج (وضع الأسماء في نفس الصف) في لغة أخرى (C #، دلفي، PHP، whathever كنت تستخدم لجهودكم التطبيق).

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