2011-08-09 7 views
0

私はいくつかのフィールドを含むテーブルを持っています。主キーはuserIdです。SQLクエリの行を複製する

+------+ 
|userId| 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
...etc 

が、私は今、A、B、Cで終わる新しい行を追加しますので、同じようにしたい:現在user id列には値が '1,2,3,4 ...など' そうのように含まれています

+------+ 
|userId| 
+------+ 
| 1 | 
| 1a | 
| 1b | 
| 1c | 
| 2 | 
| 2a | 
| 2b | 
| 2c | 
...etc 

新しい行は、userIdを除く親行と同じにする必要があります。 (つまり、1a、1b & 1cは1と一致する必要があります)

また、「a」、「b」または「c」がユーザーID列に存在しないことは保証できません。

これを迅速かつ簡単に行うSQLクエリを作成する方法はありますか?

+1

私はあなたがこれを行うには非常に良い理由を持っている願っています。 – Jacob

+0

挿入クエリが必要ですか?データベースのバージョンは何ですか?mysql 4,5,6?データベース依存関数またはsql99互換性のあるものだけを使用できますか? 1つのクエリでなければならないのでしょうか? – Ali

+0

@これはMySQL 5.1です。これは複数のクエリにすることができます。 @cularis。 – Urbycoz

答えて

3

あなたが解決しようとしているものよりも多くの問題に遭遇します!

文字を格納するための新しい列を追加し、元のUserIdとこの新しい列を主キーにします。

userIdだけが必要な場合は、文字部分を分割する必要があります。これはクエリの費用がかかり、本当の苦痛になります。

1

私はKMに同意します。なぜこれらの重複したIDを作成しているのか分かりませんが、それは不快な方向に感じます。

つまり、克服すべき障害は一つしかありません。どうやら、MySQLの同じテーブルから選択したり、同じテーブルに挿入したりすることはできません。

だから、あなたは本当のテーブルに挿入し、第1の一時表に挿入する必要があります...

CREATE Temporary TABLE MyNewUserIDs (
    UserID VARCHAR(32) 
) 

INSERT INTO 
    myNewUserIDs 
SELECT 
    CONCAT(myTable.UserID, suffix.val) 
FROM 
    myTable 
INNER JOIN 
    (SELECT 'A' as val UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D') AS suffix 
    ON RIGHT(myTable.UserID, 1) <> Suffix.val 
WHERE 
    NOT EXISTS (SELECT * FROM myTable AS lookup WHERE UserID = CONCAT(myTable.UserID, suffix.val)) 

INSERT INTO 
    myTable 
SELECT 
    UserID 
FROM 
    MyNewUserIDs 

ご使用の環境によっては、変更するように、テーブルをロックに見てみたいことがありますIDリストの作成とテーブルへの挿入の間には行われません。

0

これは、余分な行を生成するために、SQLの観点から非常に簡単です:私はあなたが私がここで想定してきた2つの異なる値として保存する方法について説明しますここ

キロの答え@ことをやります。必要に応じて、ユーザIDと接尾辞を自由に連結してください。

INSERT myTable (userid, suffix, co11, col2, ...coln) 
SELECT M.userid, X.suffix, M.col1, M.col2, ..., M.coln 
FROM 
    myTable M 
    CROSS JOIN 
    (SELECT 'a' AS Suffix UNION ALL SELECT 'b' UNION ALL SELECT 'c') X 
WHERE 
    NOT EXISTS (SELECT * 
      FROM 
      MyTable M2 
      WHERE 
      M2.userid = M.userid ANS M2.Suffix = X.Suffix) 
+0

これはMySQLであり、INSERTとSELECTの両方でmyTableを参照することができないという通知があります。 – MatBailie

+1

@Dems:それを知らなかった。だから初心者... – gbn

+0

こんにちは、SQL Snobbery? ;) – MatBailie

関連する問題