2011-07-22 16 views
2

tableoneこれらの2つのmysqlテーブルをマージするには?

a |b| c 
-------- 
a1 | |c1 
a2 | |c2 
a3 | |c3 

tabletwo

a | b 
----- 
a1|b1 
a2|b2 
a3|b3 
a4|b4 
a5|b5 

だから私は2台を持っていると私はそれらをマージしたい

a | b | c 
a1| b1|c1 
a2| b2|c2 
a3| b3|c3 
a4| b4| 
a5| b5| 

を吸収合併。私はphpmyadminの中で、これらの二つのオプションを試みた:

INSERT IGNORE INTO tableone SELECT * FROM tabletwo; 
REPLACE INTO tableone SELECT * FROM tabletwo; 

しかし、両方が(別の一つのテーブルを置く)同じことを行うのが、私はそれらをマージしたいです。どのようなクエリを使用しなければならないのですか?

INSERT IGNORE INTO tableone (a) SELECT a FROM tabletwo; 

UPDATE tableone, tabletwo 
SET tableone.b = tabletwo.b 
WHERE tableone.a = tabletwo.a; 

をPSTに答えるために、このような何かを、tableoneb列を持っていないと仮定:私は

答えて

3

が背中合わせにこれらのクエリを試してみてください...あなたが質問を理解してほしいです:

INSERT INTO tablethree (a, b, c) 

SELECT * FROM ((
    SELECT 
     tableone.a AS a, 
     tabletwo.b AS b, 
     tableone.c AS c 

    FROM tableone 

    LEFT OUTER JOIN tabletwo 
    ON tableone.a = tabletwo.a 
) UNION (
    SELECT 
     tabletwo.a AS a, 
     tabletwo.b AS b, 
     tableone.c AS c 

    FROM tableone 

    RIGHT OUTER JOIN tabletwo 
    ON tableone.a = tabletwo.a 
)) AS x 

これはテストされていませんが、動作するはずです。 ( "Should" ...)UNIONは、MySQLのFULL OUTER JOINが不足している場合の回避策です。

+0

+からその欠落エントリのNULL列を取得し、取得します1ポスターが最終的に 'tableone 'をどのように変更するかを尋ねているので。しかし、もし結果が 'tableone'と同じスキーマを持つ(おそらく空の)3番目のテーブルに入るべきなら、これはどのようにして行うことができますか? –

+0

#1104 - SELECTはMAX_JOIN_SIZE個以上の行を調べます。あなたのWHEREを確認し、SET SQL_BIG_SELECTS = 1またはSET SQL_MAX_JOIN_SIZE = SELECTを使用してください。SELECTが大丈夫ですが、これは理解できません。 – faq

+0

テーブルが本当に大きく、MySQLがクエリの実行を拒否しています。 SET SQL_BIG_SELECTS = 1はそのメッセージの重要なビットです。 – cdhowie

1
CREATE TABLE merged AS 
SELECT A.a,A.b,B,B.c FROM 
tabletwo A LEFT JOIN tableone USING (a); 

それはtabletwoは、すべてのキーを持っているので、それは完璧なケースですが、もちろん

を必要なすべてのキーを持っているので、私はtabletwo最初に選びました。

setoneを使用すると、tableoneのキーとtablewoのキーの共通部分がtableoneのすべてのキーまたはtablewoのすべてのキーと同じではない場合、どうしますか?これを行う:

CREATE TABLE merged AS 
SELECT 
    A.a,B.b,C.c 
FROM 
(
    SELECT a FROM tableone 
    UNION 
    SELECT a FROM tabletwo 
) A 
LEFT JOIN tableone B USING (a) 
LEFT JOIN tabletwo C USING (a); 

インラインSELECT Aには、すべてのマージされたキーがセットされたUNIONとして含まれています。 Cから何かが欠けBから

任意の行がBから何かが足りないCからC.

からその欠落エントリ任意の行のためのNULL列はB.

関連する問題