带有多个值的条件插入

时间:2014-09-19 15:55:35

标签: mysql

此问题建立在previous question on conditional inserts之上。我现在要解决的问题是,当我使用相同的VALUES(设置为LAST_INSERT_ID)插入多个@EVENT_ID时。使用我以前的C#脚本,这就是声明的样子:

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
VALUES (@EVENT_ID, 'SBEPN', '41420F'), (@EVENT_ID, 'Notes', 'Sent to USER2');

使用相同的C#脚本进行修改以利用链接问题中提供的条件插入,这就是我最终的结果(如果只有一组VALUES它按预期工作):

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT t.* FROM ( 
    SELECT @EVENT_ID, 'SBEPN', '41420F', @EVENT_ID, 'Notes', 'Sent to USER2') 
t 
WHERE @EVENT_ID IS NOT NULL;

问题: 按原样运行“错误代码1241.操作数应包含1列”。这是有道理的,我提供了六个数据,根据表的定义,它需要三个数据。我试着用两组三个数据提供数据,用括号分隔试图模仿上面原始脚本中的VALUES子句,以及其他各种我无法工作的事情:

SELECT t.* FROM (
SELECT (@EVENT_ID, 'SBEPN', '41420F'), (@EVENT_ID, 'Notes', 'Sent to USER2')) 
t 
WHERE @EVENT_ID IS NOT NULL;

可能有多达六个这样的后续条款,并且它们都需要使用相同的LAST_INSERT_ID(设置为变量@EVENT_ID),因此它们与单亲行。

解决方法:我知道我可以使用三个一组进行多次数据插入,EG:

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT t.* FROM ( 
    SELECT @EVENT_ID, 'SBEPN', '41420F') 
t 
WHERE @EVENT_ID IS NOT NULL;

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE)     
SELECT t.* FROM (
    SELECT @EVENT_ID, 'Notes', 'Sent to USER2')
t 
WHERE @EVENT_ID IS NOT NULL;

问题:我可以在单个插入语句中执行此操作,该语句模拟第一个示例中存在多个VALUES语句的结果吗?

1 个答案:

答案 0 :(得分:1)

这是你想要的吗?

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
     SELECT t.*
     FROM (SELECT @EVENT_ID as e, 'SBEPN', '41420F' UNION ALL
           SELECT @EVENT_ID as e, 'Notes', 'Sent to USER2'
          ) t
     WHERE e IS NOT NULL;