كيفية استخدام مجموعة من مع الاتحاد في T-SQL
-
05-07-2019 - |
سؤال
وكيف يمكنني استخدام مجموعة من مع الاتحاد في T-SQL؟ أريد أن مجموعة من العمود الأول من نتيجة اتحاد، وكتب SQL التالية ولكنه لا يعمل. أنا لا أعرف كيفية الرجوع إلى العمود المحدد (في هذه الحالة هو 1) من نتيجة الاتحاد. بفضل كبير.
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
المحلول
وGROUP BY 1
اقتباس فقرة> مجموعةولقد عرفت أبدا من قبل لدعم استخدام الترتيبية، ORDER BY فقط. وفي كلتا الحالتين، الخلية فقط تدعم GROUP BY ليست بما في ذلك جميع الأعمدة دون دالات التجميع يقوم عليها. الترتيبية لا ينصح ممارسة إما لأنهم إذا كنت بناء على أمر من SELECT - إذا كان هذا يغير، لذلك لا ORDER BY الخاص بك (أو GROUP BY إذا كان معتمدا)
وليس هناك حاجة لتشغيل GROUP BY
على محتويات عندما كنت تستخدم UNION
- UNION يضمن أن تتم إزالة التكرارات. UNION ALL
أسرع لأنه لا - وفي هذه الحالة قد تحتاج إلى GROUP BY ...
والاستعلام الخاص بك يحتاج فقط إلى أن تكون:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
نصائح أخرى
وتحتاج إلى الاسم المستعار الاستعلام الفرعي. وبالتالي، يجب أن يكون هذا البيان:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
وتحديد عمود من السهل:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
ولكن هذا لا يحل المشكلة الرئيسية لهذا الاستعلام: ما الذي ينبغي القيام به مع القيم العمود الثاني على تجميع من قبل أولا؟ منذ (غريب!) كنت تستخدم UNION
بدلا من UNION ALL
، سوف لا يكون لديك <م> تكرار تماما م> الخلافات بين اثنين من subtables في الاتحاد، ولكن قد لا تزال لديها جيدا عدة قيم من الوقت لواحد قيمة الهوية، وكنت تعطي أي تلميح من ما تريد القيام به - دقيقة، كحد أقصى، متوسط، وخلاصة القول، أو ما ؟! محرك SQL يجب أن تعطي خطأ لأن ذلك (على الرغم من بعض مثل الخلية مجرد اختيار قيمة عشوائية العش من عدة، وأعتقد مزود خادم هو أفضل من ذلك).
وهكذا، على سبيل المثال، تغيير السطر الأول لSELECT id, MAX(time)
أو ما شابه ذلك!
with UnionTable as
(
SELECT a.id, a.time FROM dbo.a
UNION
SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id