سؤال

كيف يمكن فرز استعلام موحد برمجياً عند سحب البيانات من جدولين؟على سبيل المثال،

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

يلقي استثناء

ملحوظة:تتم محاولة ذلك على محرك قاعدة بيانات MS Access Jet

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

المحلول

في بعض الأحيان تحتاج إلى أن يكون في ORDER BY في كل قسم من الأقسام التي تحتاج إلى أن تكون مجتمعة مع UNION.

في هذه الحالة

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

نصائح أخرى

SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

أعتقد أن هذا يقوم بعمل جيد في الشرح.

ما يلي هو استعلام UNION يستخدم جملة ORDER BY:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

نظرًا لأن أسماء الأعمدة مختلفة بين عبارتي "select"، فمن الأفضل الإشارة إلى الأعمدة في عبارة ORDER BY حسب موضعها في مجموعة النتائج.

في هذا المثال، قمنا بفرز النتائج حسب supplier_name / company_name بترتيب تصاعدي، كما هو مشار إليه بـ "ORDER BY 2".

ال supplier_name / company_name الحقول في الموضع رقم 2 في مجموعة النتائج.

مأخوذة من هنا: http://www.techonthenet.com/sql/union.php

باستخدام مثال ملموس:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

الملفات:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

المجلدات:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

النتيجة المرجوة: (نتائج الاختيار الأول أولاً، أيالمجلدات أولا)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

SQL لتحقيق النتائج المرجوة:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

وهنا مثال من NORTHWIND 2007:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

ووجملة ORDER BY يحتاج فقط إلى أن البيان الأخير، بعد أن كنت قد فعلت كل ما تبذلونه من unioning. يمكنك عدة مجموعات النقابية معا، ثم وضع جملة ORDER BY بعد المجموعة الأخيرة.

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

والعمل؟ تذكر مجموعات بحثية. الحصول على مجموعة تريد استخدام اتحادا ثم قم بإجراء العمليات الخاصة بك على ذلك.

SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

و(استخدام ALIAS)

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

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

وسوف الداخلية من جدول مشتقة يتم تنفيذ من تلقاء نفسها، ولكن كجدول مشتقة يعمل بشكل جيد تماما. لقد حاولت هذه على SS 2000 SS 2005 SS 2008 R2، وجميع الأعمال الثلاثة.

وهذا هو كيف يتم ذلك

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

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


طلب عن طريق على العمود المشترك

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

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

أو

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

طلب عن طريق على أعمدة مختلفة

وهنا هو المكان الذي تحصل عليه في الواقع صعبة. باستخدام SQL 2012، حاولت المنصب وأنه لا يعمل.

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

وبعد recommandation في التعليق حاولت هذه

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

وهذا الرمز لم تجميع لكن DUMMY_ALIAS1 وDUMMY_ALIAS2 تجاوز Order By التي أنشئت في بيان Select مما يجعل هذا غير صالحة للاستعمال.

والحل الوحيد الذي كنت أفكر فيه، التي عملت بالنسبة لي هو عدم استخدام النقابة وبدلا من ذلك جعل الاستفسارات التي تديرها بشكل فردي ومن ثم التعامل معهم. ذلك أساسا، وليس باستخدام Union عندما تريد Order By

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

يجب عليك استخدام شيء من هذا القبيل ليكون لديك واحد مجموعة مرتبة:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

لا يمكن أن يتضمن الجدول الثاني اسم الجدول في بند ORDER BY.

وهكذا ...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

ولا بطرح استثناء

إذا لزم الأمر للحفاظ على الفرز الداخلي:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

وجرب هذا. عملت معي.

بالنسبة لـ Sql Server 2014/2012/أخرى (غير محددة):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top