2016-09-20 371 views
0

有沒有辦法將兩個表聯合起來,但是保持結果集中第一個表的第一個表的行?然而的OrderBy列不在選擇查詢SQL - 如何在UNION查詢中排序

例如:

表1

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

表2

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

預期結果:

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

我帶數據由以下查詢

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

以上查詢未跟蹤聯合後的訂單。
P.S - 我不想在我的選擇查詢中顯示ID
我通過連接表獲取ORDER BY列。以下是我真正的查詢

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') 
+2

已經html代碼得到了與您的SQL查詢做什麼關聯呢? – Takarii

+0

你知道你會產生結果嗎? – Semo

+1

它應該工作''SELECT姓名,姓氏從表1聯合選擇名稱,姓氏從表2訂購ID'' – Spike

回答

4

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 
0

您可以按照下面寫的,如果你確定具有重複數據,那麼請使用UNION ALL它會更快:

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

我認爲op想要保留第一張表中的行。在這種情況下,像'SELECT NAME,surname FROM( SELECT ID,name,surname FROM TABLE 1 UNION SELECT 999999999,name,surname FROM TABLE 2)t ORDER BY ID' –

0

只需使用UNION子句出來order by

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

如果您想要訂購第一張表,請使用下面的查詢。

;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 
0

您可以使用表和列一個用於ID訂購方式:

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 
+0

我很好奇:爲什麼你有'union'的第二部分是'ID = -1'? – Nebi

+0

因爲我認爲第二個表不應該按ID排序,我需要一個值 –

0

這個訂貨會的第一行設置第一然後通過任何你需要 (沒有測試代碼)

;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 
+1

表是一個保留字。此外,這不再是一個工會。 – jarlh