从一个表中选择数据并插入到表中不存在的另一个现有表中

时间:2013-08-03 17:27:40

标签: mysql sql

我的表方案如下:(粗体列名是主键)

表1: id1 - id2

表2: id2 - name2

表3: id3 - name3

表4:id1 - Id3

我想要的是拥有以下的SQL代码:

  1. 在id1和id3列中选择name2 = input = name3
  2. 的数据
  3. 插入表4
  4. 如果表4中不存在id1,id3组合,则仅插入4
  5. 目前我可以执行第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'
    

3 个答案:

答案 0 :(得分: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),它可以帮助您避免错误,并且您的查询将更具可读性。

答案 1 :(得分: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

或类似的东西。左(外连接)获取table2中的所有记录,无论它们是否存在。如果他们没有table3.name3将为null,那么这些是你想要的。

答案 2 :(得分:0)

您当前的查询可以插入, 但如果您想要拒绝插入,如果该组合已存在, 只需向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;

仅用于使查询仍然运行, 如果有重复,它什么都不做。