我有一个包含代码列表的数据集,记录分为两类,LD
和A
ID Type
1 LD
2 A
1 A
1 LD
3 LD
这两个类别是根据他们的代码分配的。 但是,有一些记录的ID是相同的,它有一些类型为“LD”,一些类型为“A”。在这种情况下,我希望这些记录的“类型”列在下面说“LD_A”。 ID为1的所有记录都已更改为保留行数的LD_A(因为它们属于两种类型) -
ID Type
1 LD_A
2 A
1 LD_A
1 LD_A
3 LD
有人可以指导我如何在sql中执行此操作吗?
答案 0 :(得分:0)
按ID分组,只获取具有多个不同类型的ID。您可以使用此查询执行此操作:
SELECT ID FROM t GROUP BY ID HAVING COUNT(DISTINCT Type) > 1
然后将此查询加入UPDATE语句中的表以“过滤”记录。 (它也需要这样,因为您不能在更新查询中的同一个表上使用WHERE和子查询。)
无论如何,这是你的最终查询:
UPDATE t
JOIN (SELECT ID FROM t GROUP BY ID HAVING COUNT(DISTINCT Type) > 1) ft USING (ID)
SET Type = 'LD_A';
答案 1 :(得分:0)
UPDATE mytable
JOIN mytable AS mytable2 ON mytable2.id=mytable.id AND mytable2.`Type`='A'
SET mytable.`Type`='LD_A', mytable2.`Type`='LD_A',
WHERE mytable.`type`='LD';
这会查找类型为“LD”且记录“A”具有相同ID的所有记录,然后将两者更新为“LD_A”
答案 2 :(得分:0)
--- SOURCE
IF ( EXISTS ( SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'TBL' ) )
BEGIN
DROP TABLE TBL
END
CREATE TABLE TBL
(
id INT ,
[type] VARCHAR(10)
)
INSERT INTO TBL
VALUES ( 1, 'LD' ),
( 2, 'A' ),
( 1, 'A' ),
( 1, 'LD' ),
( 3, 'LD' )
PRINT 'Before Update'
SELECT * FROM TBL
--- QUERY
;WITH CTE AS (
SELECT t.id ,
IIF(EXISTS ( SELECT 1
FROM ( SELECT MAX(ctr) ctr ,
id
FROM ( SELECT ROW_NUMBER() OVER ( PARTITION BY id ORDER BY id ) ctr ,
id
FROM tbl
) T
GROUP BY id
) TblXT
WHERE TblXT.id = t.id
AND ctr > 1 ), typeR, type) [typeNew],
type
FROM ( SELECT id ,
REPLACE(REPLACE(REPLACE(STUFF(( SELECT QUOTENAME([TYPE])
FROM TBL
GROUP BY [TYPE]
ORDER BY type DESC
FOR
XML PATH('')
), 1, 0, ''), '][', '_'),
'[', ''), ']', '') [typeR] ,
tbl.[type]
FROM TBL
) T
)
UPDATE CTE
SET type = typeNew
PRINT 'After Update'
SELECT * FROM TBL
结果
Before Update
id type
----------- ----------
1 LD
2 A
1 A
1 LD
3 LD
(5 row(s) affected)
After Update
id type
----------- ----------
1 LD_A
2 A
1 LD_A
1 LD_A
3 LD
(5 row(s) affected)