[英]SQL - Updating rows with individual rows from another table
尝试从名为#Test的Table1到名为#BlueTable的Table2中,将具有匹配ID和DayNumber的ID和DayNumber匹配的数据插入到每个适当的行中
我正在与此
CREATE TABLE #Test (
ID int,
DayNumber nvarchar(1),
MNumber nvarchar(2),
QLetter nvarchar(1),
Comments nvarchar(60)
)
insert into #Test(ID,DayNumber,MNumber,QLetter,Comments)
values(55,'1','2','A','000000'),
(55,'5','2','A','111111'),
(66,'7','2','A','222222'),
(66,'7','2','B','333333')
CREATE TABLE #BlueTable (
ID nvarchar(40),
DayNumber nvarchar(1),
BL_MN nvarchar(2),
BL_QL nvarchar(1),
BL_CM nvarchar(60),
BL_MN2 nvarchar(2),
BL_QL2 nvarchar(1),
BL_CM2 nvarchar(60)
)
declare @i int=1
while (@i <=7)
begin
insert into #BlueTable(ID,DayNumber)
values(55,@i),
(66,@i)
set @i=@i+1
end
declare @loop int=1,
@loopWord nvarchar(MAX)=''
while(@loop<=2)-- HOW UPDATE IS RAN
begin
exec('update #BlueTable set BL_MN'+@loopWord+'=#Test.MNumber,BL_QL'+@loopWord+'=#Test.QLetter,BL_CM'+@loopWord+'=#Test.Comments from #Test
where #BlueTable.ID=#Test.ID and #BlueTable.DayNumber = #Test.DayNumber')
set @loop =@loop+1
set @loopWord=@loop
end
select * from #Test
select * from #BlueTable order by ID
drop table #Test
drop table #BlueTable
我期望至少有一些空值,但是它似乎会覆盖以前的更新并填充新数据。 这就是我更新它的方式
我一直试图获得的输出在使用时应如下所示(从#BlueTable中选择*,其中BL_CM不是按ID的空顺序): 我想要的
ID | DayNumber | BL_MN | BL_QL | BL_CM | BL_MN2 | BL_QL2 | BL_CM2 |
55 1 2 A 000000 null null null
55 5 2 A 111111 null null null
66 7 2 A 222222 2 B 333333
相反,我得到的东西看起来像这样: 我正在得到什么
ID | DayNumber | BL_MN | BL_QL | BL_CM | BL_MN2 | BL_QL2 | BL_CM2 |
55 1 2 A 000000 2 A 000000
55 5 2 A 111111 2 A 111111
66 7 2 A 222222 2 A 222222
请帮忙 :(
看一下这个查询。 我建议您首先获得想要的结果。 然后插入第二张表。
insert into #BlueTable
select
ID, DayNumber, max(case when rn = 1 then MNumber end)
, max(case when rn = 1 then QLetter end)
, max(case when rn = 1 then Comments end)
, max(case when rn = 2 then MNumber end)
, max(case when rn = 2 then QLetter end)
, max(case when rn = 2 then Comments end)
from (
select
*, rn = row_number() over (partition by ID, DayNumber order by MNumber, QLetter)
from
#Test
) t
group by ID, DayNumber
一个简单的INNER JOIN
更新应该适用于您的方案。 下面是如何将表中的列更新到另一个的示例。
UPDATE T1
SET T1.BL_CM2 = T2.BL_CM2, T1.BL_QL2 = T2.BL_QL2, ... more columns
FROM #Test T1
INNER JOIN #BlueTable T2
ON T1.ID = T2.ID AND T1.DAYNUMBER = T2.DAYNUMBER
编辑 :
我认为您正在寻找的内容如下:
UPDATE T1
SET T1.BL_MN = T2.MNumber, T1.BL_QL = T2.QLetter, T1.BL_CM = T2.Comments,
T1.BL_MN2 = T3.MNumber, T1.BL_QL2 = T3.QLetter, T1.BL_CM2 = T3.Comments
FROM #BlueTable T1
LEFT JOIN #Test T2
ON T1.ID = T2.ID AND T1.DAYNUMBER = T2.DAYNUMBER AND T2.QLetter = 'A'
LEFT JOIN #Test T3
ON T1.ID = T3.ID AND T1.DAYNUMBER = T3.DAYNUMBER AND T3.QLetter = 'B'
在我看来,您永远不会得到这个结果,因为当您将记录插入#Test表时,您会重复ID = 66,DayNumber = 7。
ID | DayNumber | BL_MN | BL_QL | BL_CM | BL_MN2 | BL_QL2 | BL_CM2 | 55 1 2 A 000000 2 A 000000 55 5 2 A 111111 2 A 111111 66 7 2 A 222222 2 A 222222
因此,结果可能看起来像这样。 如果不想看到此结果,则可以仅按QLetter ='A'进行过滤。
ID | DayNumber | BL_MN | BL_QL | BL_CM | BL_MN2 | BL_QL2 | BL_CM2 | 55 1 2 A 000000 2 A 000000 55 5 2 A 111111 2 A 111111 66 7 2 A 222222 2 A 222222 66 7 2 B 333333 2 B 333333
因此,我建议您在填充数据之后和进行任何更新之前使用此查询。 对于此更新,您实际上不需要SQL Procedure。 只需将此SELECT查询转换为更新即可。 希望这会有所帮助。
SELECT
B.ID,
B.DayNumber,
T.MNumber AS BL_MN_1,
T.QLetter AS BL_QL_1,
T.Comments AS BL_CM_1,
T.MNumber AS BL_MN_2,
T.QLetter AS BL_QL_2,
T.Comments AS BL_CM_2
FROM #BlueTable AS B
INNER JOIN #Test T ON T.ID = B.ID AND T.DayNumber = B.DayNumber
要么
SELECT
B.ID,
B.DayNumber,
T.MNumber AS BL_MN_1,
T.QLetter AS BL_QL_1,
T.Comments AS BL_CM_1,
T.MNumber AS BL_MN_2,
T.QLetter AS BL_QL_2,
T.Comments AS BL_CM_2
FROM #BlueTable AS B
INNER JOIN #Test T ON T.ID = B.ID AND T.DayNumber = B.DayNumber AND T.QLetter = 'A'
实际上,我想知道,为什么要尝试使用相同的信息更新#BlueTable。 对于这种情况,它将起作用。 如果您告诉我特定的要求,那也可能会更改此解决方案。 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.