2014-01-17 5 views
13

2つの表を結合する方法はありますか?最初の表の行は結果セットの最初に表示されますか?例えばSql server unionしかし順序を保つ

表1

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

表2

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

私は結果がなるように設定したい:

残念ながら
name  surname 
------------------- 
John   Doe 
Bob   Marley 
Ras   Tafari 
Lucky  Dube 
Abby  Arnold 

、組合は何とかテーブルを並べ替え。これを回避する方法はありますか?

答えて

23

このお試しください: - :

SELECT name,surname,1 as rs 
FROM table1 
UNION ALL 
SELECT name,surname,2 
FROM table2 
ORDER BY rs 

あなたは、rsは、最終的な結果セットに表示したくない場合は、出力順序を保証する唯一の方法はORDER BYを使用することです

Select * 
from 
( 
Select name,surname, 1 as filter 
from Table1 
Union all 
Select name,surname , 2 as filter 
from Table2 
) 
order by filter 
+1

「EntityFramework」を使用してこれを行うにはどうすればよいですか? –

8

をサブクエリとして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 
+0

'surname'で必要なら' rs'の後に追加注文することができます。しかし、徹底的に答えてください。 – NickyvV

+0

+1 ..共用体はすべて保証しません。 –

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

。これと同じですか?

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 

明示的に定義されていない場合の順序付けは保証されません。 テーブルにクラスタ化インデックスが含まれている場合、通常は行がインデックスの順序で返されますが、これは保証されません。

+1

クラスタード・インデックスは何もしません。 –

+0

ありがとう、編集を参照してください。本当に私に注意を促したイタリック体。 – MarkD

関連する問題