SQL-如何在UNION查询中排序

Nav*_*aig 0 sql sql-server sql-server-2008

有没有一种方法可以合并两个表,但是将第一个表中的行保留在结果集中的最前面?但是,orderby列不在选择查询中

例如:

表格1

name        surname
-------------------
John         Doe
Bob          Marley
Ras          Tafari
Run Code Online (Sandbox Code Playgroud)

表2

name       surname
------------------
Lucky      Dube
Abby       Arnold
Result
Run Code Online (Sandbox Code Playgroud)

预期结果:

name        surname
-------------------
John         Doe
Bob          Marley 
Ras          Tafari
Lucky      Dube
Abby       Arnold
Run Code Online (Sandbox Code Playgroud)

我通过以下查询带来数据

SELECT name,surname FROM TABLE 1 ORDER BY ID  
UNION  
SELECT name,surname FROM TABLE 2
Run Code Online (Sandbox Code Playgroud)

上面的查询并没有跟踪联合之后的顺序。
PS-我不想在我的选择查询中显示ID,我
通过连接表获得ORDER BY Column。以下是我的真实查询

  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')
Run Code Online (Sandbox Code Playgroud)

jar*_*rlh 5

将放入UNION ALL派生表中。为了避免重复出现,请在第二个选择中select distinct添加,并添加一个NOT EXISTS,以避免在两个表中都找到相同人时返回两次:

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
Run Code Online (Sandbox Code Playgroud)