SQL حدد فرعي
-
07-07-2019 - |
سؤال
وأنا جديدة قليلا إلى 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 كنت تستخدم لجهودكم التطبيق).