سؤال

بعد استعلام SQL طويل جدًا، تكون النتيجة بهذا النموذج:

 col1 | col2 | col3 | col4
------+------+------+-----
1234  | 1    | aaaa | bbbb
2378  | 0    | aaaa | bbbb
9753  | 1    | cccc | uuuu
1234  | 0    | iiii | yyyy
2378  | 1    | iiii | yyyy
9753  | 1    | tttt | mmmm

لكنني لا أحتاج إليها بهذه الطريقة.لا بد لي من القيام ببيان SQL آخر على هذه النتيجة حيث لا بد لي من استخدامها مجموعة من العمود الثالث والرابع.بمعنى آخر صفين في واحد، مثل هذا:

col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1    | 2378 | 0    | aaaa | bbbb
1234 | 1    | 2378 | 0    | aaaa | bbbb
9753 | 1    | null | null | cccc | uuuu
1234 | 0    | 2378 | 1    | iiii | yyyy
9753 | 1    | null | null | tttt | mmmm
هل كانت مفيدة؟

المحلول

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

على سبيل المثال:

CREATE TABLE TableA (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

CREATE TABLE TableB (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

لاحظ أن هذا مجرد هيكل نموذجي يعتمد على بيانات المخرجات التي قدمتها.

بعد إنشاء هذين الجدولين، سيتعين عليك إدراج بيانات من الاستعلام إلى كل جدول من الجداول.

تمت الإضافة:ليس عليك تنفيذ نفس الاستعلام مرتين. قم بتنفيذه مرة واحدة، ثم ضع البيانات في TableA ثم قم بإجراء SELECT على TableA ثم ضع البيانات في TableB.سيوفر لك ذلك الكثير من الوقت.

ستكون الخطوة الأخيرة هي تنفيذ الاستعلام على TableA وTableB مع JOIN في العمودين Col3 وCol4.شيء من هذا القبيل:

SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)  
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4

نأمل أن يساعد هذا.

يرجى أيضًا أن تضع في اعتبارك أن هذا الحل له عيب رئيسي واحد:

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

بعد التحرير (لقد قدمت NULLS إضافية في بيانات الإخراج):

إذا كنت تريد الاحتفاظ بالقيم الخالية، فيجب عليك استخدام صلة مختلفة، على سبيل المثال: LEFT OUTER JOIN

الحلول الممكنة الأخرى هي:

  1. ما عليك سوى استبدال (SELECT * FROM dbo.Test) باستعلامك الطويل.ولكن هذا سيؤدي إلى تشغيل هذا الاستعلام مرتين.

    حدد أ.*، ب.* من (SELECT * FROM dbo.Test) صلة خارجية يسرى (SELECT * FROM dbo.Test) B على A.Col3 = B.Col3 وA.Col4 = B.Col4 وA.Col1 <> B.Col1 وA .Col2 <> ب.Col2

  2. إذا كنت تستخدم SQL 2005، فيمكنك محاولة استخدام عامل التشغيل CROSS APPLY.

قد تكون هناك حلول أخرى ولكن يجب أن تكون أكثر وصفًا حول محرك SQL الذي تستخدمه وحقوقك في قاعدة البيانات.

نصائح أخرى

همم،

سأرمي النتيجة في جدول مؤقت.ثم افعل

select 
a.col1, 
a.col2, 
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5, 
coalesce(a.col4,b.col4) as col6 
from #tmp a 
outer join #tmp b 
on a.col3 = b.col3 and a.col4 = b.col4 
where a.col2 = 0 and b.col2 = 1

هذا بالطبع على افتراض أن col2 هو مؤشر على أي جزء من الزوج لديك.

لقد وجدت الحل الصحيح، بناء على الحل الأول ل @Wodzu.

أولاً، قم بإنشاء عرض مؤقت يحتوي على النتيجة.

مع TMP AS ( -بيان SQL طويل جدًا ...)

ثانيًا، قم بالتحديد نظرًا لوجود اثنين منهم، وبهذه الطريقة يتم استدعاء الاستعلام مرة واحدة فقط.

حدد a.**, b.** من tmp a صلة داخلية tmp b بشروط.

شكرا وزو

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