【发布时间】:2015-03-29 01:30:35
【问题描述】:
我正在尝试更新 SQL Server 2000 sp4 数据库中缺失值的 45000 行。
我将尝试模拟以下值的表格设置和条件: 我有两张桌子。一个持有有效交易,另一个在某些行中有缺失值。
--Table #Trans 持有有效交易
Create Table #trans (
[DocumentNumber] [char](21) NOT NULL,
[CustomerName] [char](21) NOT NULL,
[CustomerID] [char](31) NOT NULL,
[ACTINDX] [int] NOT NULL,
[CRDTAMNT] [numeric](19, 5) NOT NULL,
[DEBITAMT] [numeric](19, 5) NOT NULL,
[TRXSORCE] [char](30) NOT NULL,
[TRXDATE] [datetime] NOT NULL
)
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('INV20123','Andrew Sesinyi','A0001',2501,25620.00,0.000,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('INV20123','Andrew Sesinyi','A0001',2201,0.000,25620.00,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('PMTRN00155','Bame Moonwa','B0001',1700,1550.00,0.0000,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('PMTRN00155','Bame Moonwa','B0001',1900,0.0000,1550.00,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('PMTRN00156','OLERATO PHAMA','OL0001',1900,0.0000,1020.00,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('PMTRN00156','OLERATO PHAMA','OL0001',1700,1020.00,0.0000,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('INV20124','Bame Moonwa','B0001',2501,18000.00,0.000,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #trans ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[TRXSORCE],[TRXDATE])
Values('INV20124','Bame Moonwa','B0001',2201,0.000,18000.00,'SALESTRN15012015','15-Jan-2015')
--Tables #GL 包含一些缺失值的事务,即--DocumentNumber、CustomerID A 和 CustomerName
Create Table #GL(
[DocumentNumber] [char](21) ,
[CustomerName] [char](21),
[CustomerID] [char](31),
[ACTINDX] [int] NOT NULL,
[CRDTAMNT] [numeric](19, 5) NOT NULL,
[DEBITAMT] [numeric](19, 5) NOT NULL,
[ORTRXSORCE] [char](30) NOT NULL,
[TRXDATE] [datetime] NOT NULL
)
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','Andrew Sesinyi','A0001',2501,25620.00,0.000,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','Andrew Sesinyi','A0001',2201,0.000,25620.00,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','Bame Moonwa','B0001',1700,1550.00,0.0000,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','Bame Moonwa','B0001',1900,0.0000,1550.00,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','','',1900,0.0000,1020.00,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('','','',1700,1020.00,0.0000,'PYMNTTRN17012015','17-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('INV20124','','',2501,18000.00,0.000,'SALESTRN15012015','15-Jan-2015')
INSERT INTO #GL ([DocumentNumber],[CustomerName],[CustomerID],[ACTINDX],[CRDTAMNT],[DEBITAMT],[ORTRXSORCE],[TRXDATE])
Values('INV20124','','',2201,0.000,18000.00,'SALESTRN15012015','15-Jan-2015')
当我运行以下更新语句时,错误的更新会呈现到#GL 记录。在这种情况下是否有替代方法或更好的方法来应用更新记录。
UPDATE #GL
SET DocumentNumber = TR.DocumentNumber
, CustomerName = TR.CustomerName
,CustomerID =TR.CustomerID
FROM #GL GL
INNER JOIN #trans TR ON GL.ORTRXSORCE = TR.TRXSORCE
WHERE GL.ACTINDX = TR.ACTINDX
AND GL.DEBITAMT = TR.DEBITAMT
OR GL.CRDTAMNT = TR.CRDTAMNT
AND GL.TRXDATE = TR.TRXDATE
注意,我正在尝试使用此方法更新 45000 条缺失值的记录。 N.B 多个交易可以作为一个批次发布到#GL,因此共享 TRXSORCE
非常感谢您提前提供的见解。
【问题讨论】:
-
是什么让您认为您的查询更新不正确?
-
您的 where 子句可能有歧义。你正在混合 ands 和 ors。尝试将逻辑语句显式包装在括号中。此外,FWIW,我个人只会在 where 子句中添加所有这些内容作为连接条件的一部分。没关系,但我觉得很奇怪。
-
嗨大卫,我已经测试了结果集并比较了原始值和更新值。存在不匹配。
-
UPDATE #GL SET DocumentNumber = TR.DocumentNumber , CustomerName = TR.CustomerName ,CustomerID =TR.CustomerID FROM #GL GL INNER JOIN #trans TR ON GL.ORTRXSORCE = TR.TRXSORCE WHERE GL.ACTINDX = TR.ACTINDX 和 GL.DEBITAMT = TR.DEBITAMT 和 GL.CRDTAMNT = TR.CRDTAMNT 和 GL.TRXDATE = TR.TRXDATE
-
工作在一个小数据集上,我还没有在 45000 行上进行测试。谢谢 Xedni。
标签: sql-server database tsql sql-server-2000