2016-09-20 2 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 - Я не хочу показывать идентификатор в выбранном запросе
Я получаю 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') 
+2

какое отношение имеет HTML-код должен делать с SQL запроса? – Takarii

+0

Вы знаете, что вы производите результаты²? – Semo

+1

он должен работать '' SELECT имя, фамилия FROM TABLE 1 UNION SELECT имя, фамилия FROM TABLE 2 ORDER BY 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, фамилия FROM ( SELECT ID, имя, фамилия FROM ТАБЛИЦА 1 UNION SELECT 999999999, имя, фамилия 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

Мне любопытно: почему у вас есть 'ID = -1' во второй части' union'? – 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

Смежные вопросы