简体   繁体   中英

SQL - How to Order By in UNION query

Is there a way to union two tables, but keep the rows from the first table appearing first in the result set? However orderby column is not in select query

For example:

Table 1

name        surname
-------------------
John         Doe
Bob          Marley
Ras          Tafari

Table 2

name       surname
------------------
Lucky      Dube
Abby       Arnold
Result

Expected Result:

name        surname
-------------------
John         Doe
Bob          Marley 
Ras          Tafari
Lucky      Dube
Abby       Arnold

I am bringing Data by following query

SELECT name,surname FROM TABLE 1 ORDER BY ID  
UNION  
SELECT name,surname FROM TABLE 2

The above query is not keeping track of order by after union.
PS - I dont want to show ID in my select query
I am getting ORDER BY Column by joining tables. Following is my real query

  SELECT tbl_Event_Type_Sort_Orders.Appraisal_Event_Type_ID AS Appraisal_Event_Type_ID , ISNULL(tbl_Appraisal_Event_Types.Appraisal_Event_Type_Display_Name, 'UnCategorized') AS  Appraisal_Event_Type_Display_Name 
INTO #temptbl
FROM tbl_Event_Type_Sort_Orders 
INNER JOIN tbl_Appraisal_Event_Types
ON tbl_Event_Type_Sort_Orders.Appraisal_Event_Type_ID = tbl_Appraisal_Event_Types.Appraisal_Event_Type_ID
WHERE 1=1
AND User_Name='abc' 
ORDER BY tbl_Event_Type_Sort_Orders.Sort_Order

SELECT * FROM #temptbl 
UNION 
SELECT DISTINCT (tbl_Appraisal_Event_Types.Appraisal_Event_Type_ID) AS Appraisal_Event_Type_ID , ISNULL(tbl_Appraisal_Event_Types.Appraisal_Event_Type_Display_Name, 'UnCategorized') AS  Appraisal_Event_Type_Display_Name 
FROM tbl_Appraisal_Event_Types
INNER JOIN tbl_Appraisal_Events
ON tbl_Appraisal_Event_Types.Appraisal_Event_Type_ID = tbl_Appraisal_Events.Event_Type_ID
INNER JOIN tbl_Appraisals 
ON tbl_Appraisal_Events.Appraisal_ID = tbl_Appraisal_Events.Appraisal_ID
WHERE 1=1
AND ((tbl_Appraisals.Assigned_To_Staff_User) = 'abc'  OR (tbl_Appraisals.Assigned_To_Staff_User2) = 'abc' OR (tbl_Appraisals.Assigned_To_Staff_User3) = 'abc')

Put a UNION ALL in a derived table. To keep duplicate elimination, do select distinct and also add a NOT EXISTS to second select to avoid returning same person twice if found in both tables:

select name, surname
from
(
    select distinct name, surname, 1 as tno
    from table1
    union all
    select distinct name, surname, 2 as tno
    from table2 t2
    where not exists (select * from table1 t1
                      where t2.name = t1.name
                        and t2.surname = t1.surname)
) dt
order by tno, surname, name

You can write as below, if you are ok with duplicate data then please use UNION ALL it will be faster:

SELECT NAME, surname FROM (
SELECT ID,name,surname FROM TABLE 1 
UNION
SELECT ID,name,surname FROM TABLE 2 ) t ORDER BY ID

simply use a UNION clause with out order by .

   SELECT name,surname FROM TABLE 1 
   UNION
   SELECT name,surname FROM TABLE 2

if you wanted to order first table use the below query.

;WITH cte_1
AS
 (SELECT name,surname,ROW_NUMBER()OVER(ORDER BY  Id)b FROM TABLE 1 )
SELECT name,surname
FROM cte_1
UNION 
SELECT name,surname 
FROM TABLE 2 

You can use a column for the table and one for the ID to order by:

SELECT x.name, x.surname FROM (
    SELECT ID, TableID = 1, name, surname
    FROM table1

    UNION  ALL

    SELECT ID = -1, TableID = 2, name, surname
    FROM table2
) x
ORDER BY x.TableID, x.ID

this will order the first row sets first then by anything you need (haven't tested the code)

;with cte_1
as 
 (SELECT ID,name,surname,1 as table_id FROM TABLE 1 
  UNION
  SELECT ID,name,surname,2 as table_id FROM TABLE 2 ) 
SELECT name, surname 
FROM cte_1
ORDER BY table_id,ID

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM