Ответ 1
Попробуйте следующее: -
Select *
from
(
Select name,surname, 1 as filter
from Table1
Union all
Select name,surname , 2 as filter
from Table2
)
order by filter
Есть ли способ объединения двух таблиц, но сохранить строки из первой таблицы, появляющиеся сначала в наборе результатов?
Например:
Таблица1
name surname
-------------------
John Doe
Bob Marley
Ras Tafari
Table2
name surname
------------------
Lucky Dube
Abby Arnold
Я хочу, чтобы результирующий набор был:
name surname
-------------------
John Doe
Bob Marley
Ras Tafari
Lucky Dube
Abby Arnold
К сожалению, профсоюз каким-то образом переупорядочивает таблицу. Есть ли способ обойти это?
Попробуйте следующее: -
Select *
from
(
Select name,surname, 1 as filter
from Table1
Union all
Select name,surname , 2 as filter
from Table2
)
order by filter
Единственный способ гарантировать порядок вывода - использовать ORDER BY
:
SELECT name,surname,1 as rs
FROM table1
UNION ALL
SELECT name,surname,2
FROM table2
ORDER BY rs
Если вы не хотите, чтобы rs
отображался в конечном наборе результатов, введите UNION
в качестве подзапроса:
SELECT name,surname
FROM (
SELECT name,surname,1 as rs
FROM table1
UNION ALL
SELECT name,surname,2
FROM table2
) t
ORDER BY rs
;WITH cte as (
SELECT name, surname, 1 as n FROM table1
UNION ALL
SELECT name, surname, 2 as n FROM table2
UNION ALL
SELECT name, surname, 3 as n FROM table3
)
SELECT name, surname
FROM cte
ORDER BY n;
. Как это?
CREATE TABLE #Table1 (Names VARCHAR(50))
CREATE TABLE #Table2 (Names VARCHAR(50))
INSERT INTO #Table1
(
Names
)
VALUES
('John Doe'), ('Bob Marley'), ('Ras Tafari')
INSERT INTO #Table2
(
Names
)
VALUES
('Lucky Dube'), ('Abby Arnold')
SELECT ArbSeq = 1, *
FROM #Table1
UNION ALL
SELECT ArbSeq = 2, *
FROM #Table2
ORDER BY ArbSeq
Следует отметить, что упорядочение не гарантируется, если явно не определено. Если таблица содержит кластерный индекс, строки, как правило, возвращаются в порядке индекса, но это не гарантируется.