6

私のテーブルスキームは次のとおりです:(太字の列名は主キーです)

表 1: id1 - id2

表 2: id2 - name2

表 3: id3 - name3

表 4: id1 - Id3

私がやりたいのは、SQLコードを次のようにすることです:

  1. name2=input=name3 である id1 列と id3 列のデータを選択します
  2. 表 4 に挿入
  3. id1、id3 の組み合わせがテーブル 4 に存在しない場合のみ、4 に挿入します

現在、ステップ 1 と 2 を実行できますが、(実行できると仮定して) ステップ 3 の正しい「NOT EXIST」の構文を取得できません。

これは現在私のコードです:

INSERT INTO table4( id1, id3) 
SELECT id1, id3
FROM table2
INNER JOIN table1 ON table1.id2 = table2.id2
INNER JOIN table3 ON table2.name2 = table3.name3
WHERE name2 LIKE  'input'
4

3 に答える 3

2

ここで必要なクエリ

insert into table4(id1, id3) 
select t1.id1, t3.id3
from table2 as t2
   inner join table1 as t1 on t1.id2 = t2.id2
   inner join table3 as t2 on t2.name2 = t3.name3
where
   t2.name2 like 'input' and 
   not exists (
       select *
       from table4 as t4
       where t4.id1 = t1.id1 and t4.id3 = t3.id3
   )

アドバイスとして、クエリでは常にエイリアスを使用することをお勧めします (および列を として参照しますalias.column_name)。バグを回避するのに役立ち、クエリが読みやすくなります。

于 2013-08-03T17:33:49.993 に答える
0

私はあなたがこれを探していると思います

INSERT INTO table4( id1, id3) 
SELECT id1, id3
FROM table2
INNER JOIN table1 ON table1.id2 = table2.id2
Left JOIN table3 ON table2.name2 = table3.name3
WHERE name2 LIKE  'input' and table3.name3 is null

または似たようなもの。Left (外部結合) は、存在するかどうかに関係なく、table2 のすべてのレコードを取得します。そうでない場合、table3.name3 は null になるため、それらが必要なチャップです。

于 2013-08-03T17:33:25.640 に答える
0

現在のクエリは挿入に問題ありませんが、その組み合わせが既に存在する場合に挿入を拒否する場合は、これらの 2 つの列を含む table4 に主キーを追加するだけです。

クエリで次のことを行います。

INSERT INTO table4( id1, id3) 
SELECT id1, id3
FROM table2
INNER JOIN table1 ON table1.id2 = table2.id2
INNER JOIN table3 ON table2.name2 = table3.name3
WHERE name2 LIKE  'input'
ON DUPLICATE KEY UPDATE id1=id1;

これは、クエリを引き続き実行するためのものであり、重複がある場合は何もしません。

于 2013-08-03T17:35:19.130 に答える