INSERT INTO与工会(Insert into with union)

2019-08-17 06:09发布

我有个问题。 有三个表:T1,T2,T_target。 T1和T2表有许多不同的列,但我只需要从两个ID列。 该T_target表具有场和另一个的ID柱:project_No。

有它出现在T1和T2过一些ID,但我不想它们之间创建副本,如果一个ID出现在两个表中它已经被插入到T_target只有一次,但如果它已经在T_target它的使其作用两次。 其他的标准是每个新插入的ID必须在“project_No”列是值21。 因此,如:

T1:

ID
2548
2566
2569
2843
2888
...

T2:

ID
2557
2566
2569
2700
2913
2994
3018
5426
...

T_target:

ID     project_No
2976   1
3331   7
4049   7
5426   8
5915   3
6253   10
...

而结果,我想看看:

T_target:

ID     project_No
2548   21
2557   21
2566   21
2569   21
2700   21
2843   21
2888   21
2913   21
2976   1
2994   21
2018   21
3331   7
4049   7
5426   8
5426   21
5915   3
6253   10
...

所以,我这个代码试了一下(在这里“NOT NULL”的标准,因为这两个T_target列是主键,这一点很重要):

insert into T_target (ID, project_No)
  select (select ID
  from T1 where ID is not NULL
 union
  select ID
  from T2 where ID is not NULL), 21

select * from T_target

该错误消息:!“消息512,级别16,状态1,行2子查询返回大于1倍的值时,子查询如下=,=,这是不允许的<,<=,>,> =,或当子查询是用作表达。该语句已终止“。

然后我试着用VALUES语句,而不是第一个SELECT和括号,但错误是一样的。

还有一个类似的问题: MySQL的查询:如何使用UNION插入? 但因为它表明值,然后选择之间的语法错误,这个解决方案并不为我工作。

请给我一只手。 谢谢!

Answer 1:

这应该做你需要什么

INSERT INTO T_target
            (ID,
             project_No)
SELECT ID,
       21
FROM   T1
WHERE  ID IS NOT NULL
UNION
SELECT ID,
       21
FROM   T2
WHERE  ID IS NOT NULL 


Answer 2:

我认为你必须修改那个一点,以避免在SELECT语句中的ID的重复。

INSERT INTO T_target
            (ID,
             project_No)

SELECT ID, 21 
FROM (
SELECT ID
FROM   T1
WHERE  ID IS NOT NULL
UNION
SELECT ID
FROM   T2
WHERE  ID IS NOT NULL 
) A


文章来源: Insert into with union