سؤال

وكيف يمكنني استخدام مجموعة من مع الاتحاد في 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top