6

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

表 1:id1 - id2

表 2:id2 - name2

表 3:id3 - name3

表 4:id1 - Id3

我想要做的是有 sql 代码:

  1. 选择 id1 和 id3 列中 name2=input=name3 的数据
  2. 插入表 4
  3. 表 4 中不存在 id1、id3 组合时才插入 4

目前我可以执行第 1 步和第 2 步,但是(假设可以完成)我无法为第 3 步正确获取“不存在”的语法。

这是我目前的代码:

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 将为空,那么这些就是你想要的。

于 2013-08-03T17:33:25.640 回答
0

您当前的查询可以插入,但如果您想在该组合已存在的情况下拒绝插入,只需向 table4 添加一个包含这 2 列的主键。

在查询中执行:

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 回答