0

私はstackoverflowに慣れていないので、優しくしてください。SQL の構文に深刻な問題があります。肝心なのは、あるテーブルから別のテーブルに重複なしでコピーしたいということです。2 つのフィールドを比較し、destinationTB の field1 に NULL がある場合にのみ挿入するつもりでした。

私はSQLステートメントの初心者であることを知っておいてください.変数を使用できるかなど、詳しい知識があれば役立ちます. スタックオーバーフローの調査から最初の声明を受け取りましたが、それを完了することができませんでした。

これが私が持っているものです。助けてくれてありがとう。

 INSERT INTO destinationTB
 SELECT sourceTB.field1, destinationTB.field1
 FROM sourceTB
 LEFT JOIN destinationTB
 ON sourceTB.field1 = destinationTB.field1
 WHERE destinationTB.field1 IS NULL;

----- 修正された質問 -----

ヒントをありがとう!質問 (および今後の質問) をより理解しやすいものに修正するよう努めます。また、前回の質問でぎこちない「初心者」の匂いがしたことをお詫びします。

私が探している最終結果は、重複することなく、あるテーブルから別のテーブルにコピーすることです。私が取り組んでいる2つのテーブルがあります。1 つ目は、destinationTB です。これには 4 つのフィールドがあり、そのうちの 1 つだけを入力します。2 番目のテーブルは sourceTB で、複数のフィールドがありますが、情報を取得する必要があるのはそのうちの 1 つだけです。私の計画は、INSERT を destinationTB に開始することでした。最初の値がそこになかったので、NULL として返されるはずです。最初の挿入が完了した後、文字列は現在存在していたのと同じ値に対してまだ実行されていましたが、NULL を報告しなくなり、destinationTB にない別の値が見つかるまで先に進みました。

例として、テレビを見てみましょう。テレビのメーカーは複数あります。この例では、SHARP-32in、SHARP-45in、SHARP-60in があるとします。sourceTB に 3 つあるにもかかわらず、destinationTB に SHARP のインスタンスを 1 つだけ持たせたいのです。そのため、その JOIN ステートメントを使用して、destinationTB.manufacturer と sourceTB.manufacturer を比較しようとしました。このクエリを実行すると、後で貼り付けられます。この段落では、3 つのインスタンスすべてが返されるため、destinationTB に 3 つの SHARP 値が含まれることになります。

あなたの提案に基づいて試した最新のものは次のとおりです。

INSERT INTO destnationTB (field1)
SELECT sourceTB.field1
FROM sourceTB
LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1
WHERE destinationTB.field1 IS NULL;
4

3 に答える 3

0

さて、私は上記の修正された質問に対する解決策を思いつきました。このステートメントは、sourceTB で複数回発生する値の 1 つのインスタンスのみを返します。

INSERT INTO destinationTB (field1)
SELECT DISTINCT field2 FROM sourceTB
WHERE EXISTS (SELECT field1 FROM destinationTB)

助けてくれてありがとう、そしてここに質問を書くときのヒントをありがとう。

答えの参照先は次のとおりです。 http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

于 2013-09-11T01:42:08.943 に答える
0

この質問について、いくつかの包括的な一般化を行います。field1 は sourceTB と destinationTB の PK であり、唯一のフィールドであると想定しています。最終的な目標が 2 つのテーブルをマージdestinationTB.field1 IS NULLすることだけである場合、これはまったく影響を与えないはずです。OUTER JOINを探しています。destinationTB.field1

INSERT INTO destinationTB
  SELECT sourceTB.id 
  FROM sourceTB 
    LEFT OUTER JOIN destinationTB 
      ON sourceTB.id = destinationTB.id
  WHERE destinationTB.id IS NULL
于 2013-09-10T05:36:58.567 に答える
0

2 つのfield1列を挿入しようとしているようですが、宛先テーブルには 1 つしかありません。そのはず:

INSERT into destinationTB 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL;

挿入する必要があるすべてのフィールドに応じて展開します。構文が複雑すぎる場合は、一時テーブルにも頼ることができます。

    CREATE TEMPORARY TABLE tempTB as 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL;

    INSERT into destinationTB 
    SELECT tempTB.field1 
    FROM tempTB ;

クエリを完了すると、一時テーブルは消えます。

于 2013-09-10T00:42:36.893 に答える