我有一个包含列(id,col_id,type_id,value)的表,如下所示
| id | col_id | type_id | value | ------------------------------------ | 1 | 152 | 22 | DGL | | 2 | 152 | 27 | AD56JK-5 | | 3 | 152 | 30 | 5708 | | 4 | 154 | 22 | JVM | | 5 | 154 | 27 | AD29JL-9 | | 6 | 154 | 30 | 9584 | | 7 | 155 | 22 | MVR | | 8 | 155 | 27 | AD29JM-1 |
我想要做的是每个不同的col_id
将type_id = 30的行值更改为type_id = 22 + col_id值的行的值。
例如,值“5708”应更改为“DGL152”,值“9584”应更改为“JVM154”。在col_id = 155的情况下,没有type_id = 30的行,那么我们应该插入一个具有以下值的新行
------------------------------------ | 9 | 155 | 30 | MVR155 | ------------------------------------
表中有很多这样的记录。通过这种方式,我们应该使用type_id = 30更改行的值,或者如果表中的所有记录都不存在,则插入该行。我怎么能这样做?任何人都可以帮我解决问题。
修改
我知道如何使用UPDATE和SET设置更新值,但我要查找的是在单个查询中执行整个更新和插入过程。
谢谢和问候
答案 0 :(得分:2)
要插入或更新,请使用带有ON DUPLICATE KEY UPDATE子句的INSERT语句。 col_id + type_id必须有唯一的索引才能使其正常工作。
insert into mytable (col_id, type_id, value)
select col_id, 30 as type_id, concat(value, col_id) as new_value
from mytable src
where type_id = 22
on duplicate key update value = src.new_value;
答案 1 :(得分:1)
你能试试吗? (它在TSQL中,但你会理解它是如何工作的。)
DECLARE @TAB TABLE (ID INT,COL_ID INT,TYPE_ID INT, VALUE VARCHAR(15))
INSERT INTO @TAB VALUES
(1,152,22,'DGL152'),
(2,152,27,'AD56JK-5'),
(3,152,30,'5708'),
(4,154,22,'JVM154'),
(5,154,27,'AD29JL-9'),
(6,154,30,'9584'),
(7,155,22,'MVR'),
(8,155,27,'AD29JM-1')
UPDATE A
SET A.VALUE = B.VALUE
FROM @TAB A
JOIN @TAB B ON A.COL_ID = B.COL_ID
WHERE A.TYPE_ID = 30
AND B.TYPE_ID = 22
SELECT * FROM @TAB
结果:
更新后,为新记录编写INSERT语句。
INSERT INTO @TAB VALUES (9,155,30,'MVR155')
编辑:
我读错了这个问题。如果是这种情况,我们可能会使用MERGE
。像这样。
DECLARE @TAB TABLE (ID INT IDENTITY(1,1),COL_ID INT,TYPE_ID INT, VALUE VARCHAR(15))
INSERT INTO @TAB VALUES
(152,22,'DGL152'),
(152,27,'AD56JK-5'),
(152,30,'5708'),
(154,22,'JVM154'),
(154,27,'AD29JL-9'),
(154,30,'9584'),
(155,22,'MVR'),
(155,27,'AD29JM-1')
MERGE @TAB A
USING (SELECT * FROM @TAB WHERE TYPE_ID = 22) B
ON A.COL_ID = B.COL_ID AND A.TYPE_ID = 30
WHEN MATCHED AND A.TYPE_ID = 30 THEN UPDATE SET
VALUE = B.VALUE
WHEN NOT MATCHED THEN INSERT
(COL_ID,TYPE_ID,VALUE)
VALUES (B.COL_ID,B.TYPE_ID,B.VALUE);
SELECT * FROM @TAB
结果:
顺便说一句是TSQL。
答案 2 :(得分:0)
update b
set b.VALUE = a.VALUE + CONVERT (varchar(5), a.TYPE_ID)
from TABULAR a
join TABULAR b
on a.COL_ID = b.COL_ID
where b.[TYPE_ID] = '30' and a.TYPE_ID = '22'
如果TYPE_ID = 30不存在,则使用insert语句