Sneha Bhushan Ответов: 2

Как обновить таблицу с одним значением в строке вместо значений, разделенных запятыми


Привет. У меня есть 2 таблицы с некоторыми данными с одинаковым значением. Теперь я хочу обновить один столбец одной таблицы, используя соединение с другим. Но мне нужно, чтобы в каждой строке обновлялось одно значение, а не запятая.

Я привожу здесь пример с тем, что я пробовал.

Что я уже пробовал:

create table #tmp1(id int,pnum varchar(100),amount numeric(18,2),RecNo varchar(100))
create table #tmp2(id int,pnum varchar(100),amount numeric(18,2),RecNo varchar(100))


insert into #tmp1 values(1,'P1',100,'Rec1')
insert into #tmp1 values(2,'P2',100,'Rec2')
insert into #tmp1 values(3,'P1',100,'Rec3')
insert into #tmp1 values(4,'P1',100,'Rec4')
insert into #tmp1 values(5,'P3',100,'Rec5')

insert into #tmp2(id,pnum,amount) values(1,'P1',100)
insert into #tmp2(id,pnum,amount) values(2,'P1',100)
insert into #tmp2(id,pnum,amount) values(3,'P1',100)
insert into #tmp2(id,pnum,amount) values(4,'P3',100)

UPDATE  a
SET     a.RecNo = b.ReceiptList
FROM    #tmp2 a
		INNER JOIN
		(
			SELECT  pnum,
					STUFF((SELECT ',' + RecNo
							FROM #tmp1
							WHERE pnum = a.pnum and amount=a.amount
							FOR XML PATH ('')), 1, 1, '')  AS ReceiptList
			FROM    #tmp2 AS a
			GROUP   BY pnum,amount
		) b ON a.pnum = b.pnum
WHERE   b.ReceiptList IS NOT NULL

select * from #tmp2
		
drop table #tmp1
drop table #tmp2


Я получаю результат вот так:


id	pnum	amount	RecNo
1	P1	100.00	Rec1,Rec3,Rec4
2	P1	100.00	Rec1,Rec3,Rec4
3	P1	100.00	Rec1,Rec3,Rec4
4	P3	100.00	Rec5

однако я хочу получить результат, как показано ниже:

id	pnum	amount	RecNo
1	P1	100.00	Rec1
2	P1	100.00	Rec3
3	P1	100.00	Rec4
4	P3	100.00	Rec5

2 Ответов

Рейтинг:
1

Maciej Los

Кажется, вам нужна простейшая версия UPDATE заявление:

DECLARE @tmp1 TABLE(id int,pnum varchar(100),amount numeric(18,2),RecNo varchar(100))
DECLARE @tmp2 TABLE(id int,pnum varchar(100),amount numeric(18,2),RecNo varchar(100))

INSERT INTO @tmp1(id, pnum, amount, RecNo)
VALUES(1,'P1',100,'Rec1'), (2,'P2',100,'Rec2'), (3,'P1',100,'Rec3'),
(4,'P1',100,'Rec4'), (5,'P3',100,'Rec5')

INSERT INTO @tmp2(id,pnum,amount) 
VALUES(1,'P1',100), (2,'P1',100), (3,'P1',100), (4,'P3',100)

UPDATE a
SET a.RecNo = b.RecNo
FROM @tmp2 a INNER JOIN @tmp1 b ON a.pnum = b.pnum

SELECT *
FROM @tmp2 


Результат:
id	pnum	amount	RecNo
1	P1	100.00	Rec1
2	P1	100.00	Rec1
3	P1	100.00	Rec1
4	P3	100.00	Rec5


Рейтинг:
0

#realJSOP

Причина, по которой вы получаете список значений, разделенных запятыми, заключается в том, что подзапрос в вашем join Этот код-то, что делает это.

STUFF((SELECT ',' + RecNo
FROM #tmp1
WHERE pnum = a.pnum and amount=a.amount
FOR XML PATH ('')), 1, 1, '')  AS ReceiptList