我有一个表格,可以将某些列与另一个表中的列进行比较。如果列已更改,我想最终更改" Notes"字段以警告已更改的内容。不止一列可以改变。
简而言之,我声明了变量,我想用更改的内容更新该变量,然后使用变量更新列。
在Access中,我可以很容易地做到这一点,但是我花了两天时间尝试在SQL中完成此操作无济于事。
Declare @NewUpdate nvarchar(max)
If B.RCustNmbr <> A.RSQ_Custnmbr Set @NewUpdate = 'CustNmbr changed from ' & A.RSQ_Custnmbr & ' to ' & B.RCustNmbr & ', '
If B.RCustName <> A.RSQ_CUSTNAME Set @NewUpdate = **@NewUpdate** & 'CustName changed from ' & A.RSQ_CUSTNAME & ' to ' & B.RCustName & ', '
Update A
Set A.[Notes] = @NewUpdate & " on today's date " & A.[Notes] *(to include notes that might've been there before)*
From [Table1] A Inner Join [Table2] B on A.ID = B.ID
然后我想重置@NewUpdate变量以获取下一个ID(所以设置@NewUpdate = Null)
你能指出我正确的方向来完成这项工作吗?我真的不确定如何引用我的A&amp; A If语句中的B表。我尝试过很多东西。这是最接近的:
Declare @NewUpdate nvarchar(max)
Set @NewUpdate = (Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', '
From [Customer Master List] A INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID
Where **A.ID = 566** and B.RCustName <> A.RSQ_CustName)
(以上查询格式化):
Declare @NewUpdate nvarchar(max)
Set @NewUpdate =
(Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', '
From [Customer Master List] A
INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID
Where A.ID = 566 and B.RCustName <> A.RSQ_CustName)
但是我必须将它限制为1个ID或者我得到错误 Subquery返回的值超过1。当子查询跟随=,等等时,这是不允许的。我需要为数千条记录执行此操作。
答案 0 :(得分:1)
假设这两个表有一个公共密钥列,您可以使用这样的查询来识别更改。如果列不是基于字符的,则必须使用CAST,但这为您提供了基本的想法。
SELECT d.*
FROM (SELECT a.key,
CASE WHEN a.col1<>b.col1
THEN 'col1 changed from ' + a.col1 + ' to ' + b.col1 + ','
ELSE ''
END
+ CASE WHEN a.col2<>b.col2
THEN 'col2 changed from ' + a.col2 + ' to ' + b.col2 + ','
ELSE ''
END AS diff
FROM a INNER JOIN b ON a.key = b.key) d
WHERE d.diff <> ''
然后,您可以使用上面作为自己的子查询来连接到包含note列的表;听起来像是一张原始表中的音符栏。
UPDATE a
SET a.note = n.diff
FROM a INNER JOIN (<above select>) n ON a.key = n.key
答案 1 :(得分:0)
UPDATE Table
SET Notes = R.Notes
From
(
Select
A.TableId
'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', ' AS Notes
From
[Customer Master List] A INNER JOIN
[Customer Master List Changes TEMP] B ON A.ID = B.ID
Where
A.ID = 566 and
B.RCustName <> A.RSQ_CustName
) R
WHERE
Table.Id = R.TableId