2

私が次を持っているとしましょう:

CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age FROM (
    SELECT name, age FROM clubAmembers
    UNION
    SELECT name, age FROM clubBmembers
)
) AS atable

SELECTユニオンの前に、次のように「テーブルの先頭に新しい行を貼り付ける」ことができるようにするにはどうすればよいですか。

rownum | name| age
1 | "Jordan" | 6  <-- This is an arbitrarily inserted record with name="Jordan" age="6" that is not a part of any of the clubAmembers or clubBmembers table.

表の残りの部分(行番号2以降)には、clubAmembers、次にclubBmembersとの結合からの実際の結果が含まれます。

基本的に私が探しているのは:CREATE TABLE INSERT a row "Jordan" | 6最初の行の後の行が「rownum=2」で始まるように、unionを使用してselectを実行し、clubAmembersなどからのすべてのデータを実行します。

これを行うにはどうすればよいですか?

4

4 に答える 4

1

私はそれを正しく理解したかどうかわかりません。しかし、次のような別のユニオンを追加してみませんか。

CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age FROM (
    SELECT 1, "Jordan", 6
    UNION ALL
    SELECT name, age FROM clubAmembers
    UNION ALL
    SELECT name, age FROM clubBmembers
)
) AS atable
于 2013-02-06T05:40:56.893 に答える
1

「テーブルの先頭にある」は、リレーショナルデータベースにとって真に意味がありません。これは、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低くなることを保証するものではないことに注意してください。(対)のセマンティクスを維持しながら、がより低いことを保証したい場合は、次を使用できます。rownumclubBmembersclubAmembersrownumUNIONUNION 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

{ nameage}がテーブル内で複製される可能性がある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
于 2013-02-06T05:42:08.043 に答える
0

テーブルの作成statmenetを統計の挿入から分離できます。

  1. テーブルを作成します(どの列がそこにあるかを知っている必要があります)
  2. 最初のレコードを挿入します(INSERT INTO .... Values(...)
  3. ステートメントを使用しますが、次のようにテーブルを作成する代わりに挿入を使用します:(INSERT INTO YourNewTable.... Values(YourSubQuery)列のNrとtyeはサブクエリと一致する必要があります)
于 2013-02-06T05:41:46.873 に答える
0

これでうまくいくはずです:

CREATE TABLE newtable AS (
  SELECT (@rownum:=IFNULL(@rownum,0)+1)+1 as rownum, name, age FROM (
    SELECT name, age FROM clubAmembers
    UNION
    SELECT name, age FROM clubBmembers
  ) AS s
  UNION ALL
  SELECT 1, 'Jordan', 6
) AS atable

SQL Fiddle でのデモ: http://sqlfiddle.com/#!2/ab825/6

于 2013-02-06T09:23:59.623 に答える