「テーブルの先頭にある」は、リレーショナルデータベースにとって真に意味がありません。これは、ORDER BY
句を使用するまで順序結果が返されることが保証されないためです。句を使用すると、ディスク上の順序はとにかく重要なポイントになります。
あなたの場合、結果句で順序を保証したいので(したがって、順序付け)、を使用する必要があります。次のようなもの@rownum
を使用します。ORDER BY
CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age
FROM (
SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
UNION
SELECT name, age, 1 AS ord FROM clubAmembers
UNION
SELECT name, age, 1 AS ord FROM clubBmembers
ORDER BY ord
)
) AS atable
これは、の行がの行よりもclubAmembers
低くなることを保証するものではないことに注意してください。(対)のセマンティクスを維持しながら、がより低いことを保証したい場合は、次を使用できます。rownum
clubBmembers
clubAmembers
rownum
UNION
UNION ALL
CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age
FROM (
SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
UNION ALL
SELECT name, age, 1 AS ord FROM clubAmembers
UNION ALL
SELECT name, age, 2 AS ord FROM clubBmembers AS b
WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a
WHERE a.name = b.name AND a.age = b.age)
ORDER BY ord
)
) AS atable
{ name
、age
}がテーブル内で複製される可能性があるclubXmembers
場合は、以下を追加する必要があることに注意してDISTINCT
ください。
...
SELECT DISTINCT name, age, 1 AS ord FROM clubAmembers
UNION ALL
...
コメントのリクエストに従って、clubCmembers
テーブルがある場合は、次のようにします。
CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age
FROM (
SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
UNION ALL
SELECT name, age, 1 AS ord FROM clubAmembers
UNION ALL
SELECT name, age, 2 AS ord FROM clubBmembers AS b
WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a
WHERE a.name = b.name AND a.age = b.age)
SELECT name, age, 3 AS ord FROM clubCmembers AS c
WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a
WHERE a.name = c.name AND a.age = c.age)
AND NOT EXISTS(SELECT 1 FROM clubBmembers AS b
WHERE b.name = c.name AND b.age = c.age)
ORDER BY ord
)
) AS atable