簡體   English   中英

SQL-使用來自另一個表的單獨行更新行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM