2017-09-05 142 views
0

[涉及2個表格]我需要從TABLE1獲取跟蹤編號並將該值賦予TABLE2中的跟蹤編號列,即匹配記錄。雖然,我只需要爲TABLE2中不重複的記錄執行此操作。這意味着TABLE2中的第2行和第3行不需要更新(因爲它們完全相同),但只有第1行和第4行必須更新。我如何獲得?
還有其他欄目,但我沒有包括它們來讓示例更清晰。您在下面的查詢中看到的其他字段是使記錄具有唯一性的字段。首先,我不確定我寫的查詢是否是正確的,因爲我在解決這個問題時遇到了問題。其次,選擇工作,它是選擇,所有的值表示匹配的查詢號碼,但是當我有更新我得到一個錯誤:SQL -Update Table2與來自Table1的數據,但不更新表2中的確切重複

(「Msg 116, Level 16, State 1, Line 24 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS」).

我真的很感激一些幫助,感謝

TABLE1

|Pro #| Dept|Amount |Tracking # | 
|-----|-----|--------|-----------| 
|___2 | _35 |______5 | ______32 | 
|___2 | _35 |_____10 | ______35 | 
|___2 | _35 |_____10 | ______12 | 
|___2 | _35 |______8 | ______23 | 

TABLE2

|Pro #| Dept | Amount |Tracking # | 
|-----|-------|--------|-----------| 
|___2 | _35 | ______5| YES, it needs tracking # 
|___2 | _35 | _____10| NO, does not need tracking # 
|___2 | _35 | _____10| NO, does not need tracking # 
|___2 | _35 | ______8| YES, it needs tracking # 

代碼:

UPDATE FinalTbl 
SET [TrackingNumber] = TempTbl.[TrackingNumber] 
FROM [FedPayHistory].[dbo].[Frt_FinalNon000TEST] FinalTbl 
INNER JOIN 
(Select [Source] 
    ,[WkEndDt] 
    ,[Yr] 
    ,[Season] 
    ,[Per] 
    ,[Wk] 
    ,[Div] 
    ,[ProNum] 
    ,[ApptNum] 
    ,[Dept] 
    ,[Vend] 
    ,[AllocAmt] 
    ,[RTV] 
    ,[KeyRec] 
    ,[BatchNum] 
    ,[TrackingNumber] 
    ,[MatchCode] 
    ,count(*) as CNT 
    FROM [FedPayHistory].[dbo].[Frt_FinalNon000TEST] 
    GROUP BY [Source],[WkEndDt],[Yr],[Season],[Per],[Wk],[Div],[ProNum],[ApptNum],[Dept],[Vend],[AllocAmt],[RTV],[KeyRec],[BatchNum],[TrackingNumber],[MatchCode] 
    HAVING count(*)<2) JoinTable 
    ON 
    FinalTbl.[Source] = JoinTable.[Source] and 
    FinalTbl.[Yr] = JoinTable.[Yr] and 
    FinalTbl.[Season] = JoinTable.[Season] and 
    FinalTbl.[Per] = JoinTable.[Per] and 
    FinalTbl.[Wk] = JoinTable.[Wk] and 
    FinalTbl.[Div] = JoinTable.[Div] and 
    FinalTbl.[Dept] = JoinTable.[Dept] and 
    FinalTbl.[Vend] = JoinTable.[Vend] and 
    FinalTbl.[KeyRec] = JoinTable.[KeyRec] and 
    FinalTbl.[RTV] = JoinTable.[RTV] and 
    FinalTbl.[AllocAmt] = JoinTable.[AllocAmt] and 
    FinalTbl.[ProNum] = JoinTable.[ProNum] 

INNER JOIN [FedPayHistory].[dbo].[Frt_tempNon000] TempTbl 
ON FinalTbl.Source = TempTbl.Source and 
FinalTbl.[Yr] = TempTbl.[Yr] and 
FinalTbl.[Season] = TempTbl.[Season] and 
FinalTbl.[Per] = TempTbl.[Per] and 
FinalTbl.[Wk] = TempTbl.[Wk] and 
FinalTbl.[Div] = TempTbl.[Div] and 
FinalTbl.[Dept] = TempTbl.[Dept] and 
FinalTbl.[Vend] = TempTbl.[Vend] and 
FinalTbl.[KeyRec] = TempTbl.[KeyRec] and 
FinalTbl.[RTV] = TempTbl.[RTV] and 
FinalTbl.[AllocAmt] = TempTbl.[AllocAmt] and 
FinalTbl.[ProNum] = TempTbl.[ProNum] and 
JoinTable.[Source] = TempTbl.[Source] and 
JoinTable.[Yr] = TempTbl.[Yr] and 
JoinTable.[Season] = TempTbl.[Season] and 
JoinTable.[Per] = TempTbl.[Per] and 
JoinTable.[Wk] = TempTbl.[Wk] and 
JoinTable.[Div] = TempTbl.[Div] and 
JoinTable.[Dept] = TempTbl.[Dept] and 
JoinTable.[Vend] = TempTbl.[Vend] and 
JoinTable.[KeyRec] = TempTbl.[KeyRec] and 
JoinTable.[RTV] = TempTbl.[RTV] and 
JoinTable.[AllocAmt] = TempTbl.[AllocAmt] and 
JoinTable.[ProNum] = TempTbl.[ProNum] 
+0

錯誤消息是很清楚。您的子查詢返回多於一行。而且你還有另一個問題,你的子查詢有多個列,它如何知道要使用哪一列?您需要查看使用帶有聯接而不是子查詢的更新語句。 –

回答

0

你需要的東西是這樣的:

UPDATE t2 
SET [TrackingNumber] = t1.[TrackingNumber] 
FROM [TABLE2] t2 
INNER JOIN 
    (SELECT ProNum, 
     Dept, 
     AllocAmt, 
     Count(*) AS CNT 
    FROM [TABLE2] 
    GROUP BY ProNum, 
      Dept, 
      AllocAmt 
    HAVING count(*)<2 
) a 
ON t2.AllocAmt =a.AllocAmt AND 
    t2.ProNum = a.ProNum AND 
    t2.dept = a.dept 
INNER JOIN [TABLE1] t1 
ON t2.[Source] = t1.[Source] AND 
t2.[Yr] = t1.[Yr] AND 
t2.[Season] = t1.[Season] AND 
t2.[Per] = t1.[Per] AND 
t2.[Wk] = t1.[Wk] AND 
t2.[Div] = t1.[Div] AND 
t2.[Dept] = t1.[Dept] AND 
t2.[Vend] = t1.[Vend] AND 
t2.[KeyRec] = t1.[KeyRec] AND 
t2.[RTV] = t1.[RTV] AND 
t2.[AllocAmt] = t1.[AllocAmt] AND 
t2.[ProNum] = t1.[ProNum] AND 
a.[Dept] = t1.[Dept] AND 
a.[AllocAmt] = t1.[AllocAmt] AND 
a.[ProNum] = t1.[ProNum] 
+0

我添加了我用過的代碼和兩張表的圖像。除了最後一張表中的兩張(圖像中的第二張)以外的所有記錄都應該從臨時表中獲取跟蹤編號,但這不會發生。同樣,決賽桌上的所有記錄都應該從臨時表中獲得跟蹤號碼,除了決賽桌中的記錄是完全重複的(在決賽桌內) – NSPMacys

+0

不要忘了我的最後一條評論。我犯了一個小錯字。你給我的代碼奇妙地工作。非常感謝! – NSPMacys

相關問題