2011-07-28 6 views
5

何か存在する場合、参照テーブルからINSERTを持つことは可能ですか?MySQLとInsertを組み合わせて結合しましたか?

INSERT INTO `Test`.`Items` (
`Name` , 
`Type` , 
`Number` 
) 
VALUES (
'Pork', 'Sausage', 6 
); 

そして、私は2つの列を含む「検索」と呼ばれるルックアップテーブルを持っていることを...これはいくつかのデータを挿入するための照会であると言います。 "タイプ"と "番号"。私が望むのは、このインスタンスの "Lookup"テーブルにType Sausageが存在する場合、INSERTステートメントに6を挿入するのではなく、ルックアップテーブルから "Number"フィールドを取得することです。

enter image description here

明らかですね!

答えて

7
INSERT INTO Test.Items 
    (Name, Type, Number) 
    SELECT 'Pork', 'Sausage', COALESCE(l.Number, 6) 
     FROM Lookup l 
     WHERE l.Type = 'Sausage' 

EDIT:以下のコメントに基づいて追加のサンプル。文字列へ

使用UNION ALLは一緒に挿入されます。

INSERT INTO Test.Items 
    (Name, Type, Number) 
    SELECT 'Pork', 'Sausage', COALESCE(l.Number, 6) 
     FROM Lookup l 
     WHERE l.Type = 'Sausage' 
    UNION ALL 
    SELECT 'Halibut', 'Fish', COALESCE(l.Number, 7) 
     FROM Lookup l 
     WHERE l.Type = 'Fish' 

一時テーブルを使用して:素晴らしいです

CREATE TEMPORARY TABLE tmpItems (
    Name VARCHAR(255), 
    Type VARCHAR(255), 
    Number INT 
) 

INSERT INTO tmpItems 
    (Name, Type, Number) 
    VALUES ('Pork', 'Sausage', 6) 
INSERT INTO tmpItems 
    (Name, Type, Number) 
    VALUES ('Halibut', 'Fish', 7) 

INSERT INTO Test.Items 
    (Name, Type, Number) 
    SELECT t.Name, t.Type, COALESCE(l.Number, t.Number) 
     FROM tmpItems t 
      LEFT JOIN Lookup l 
       ON t.Type = l.Type 
+0

は、非常に素晴らしい、のいずれかCOALESCEコマンドを見たことなかったん! –

+0

複数のルックアップテーブルで別の値を指定したい場合は、どのように構造化しますか?別のテーブルLookup2たとえば、(この例を使用して)名前を検索します。 –

+1

@Lee:いくつかのアプローチがあります。 UNION ALL演算子を使用してSELECTステートメントを一緒にストリングするか、挿入する値が十分に大きい場合は、すべての値をテンポラリ・テーブルに移入してからLookupに対してJOINすることができます。私はあなたのためにそれぞれのサンプルを提供します。 –