【问题标题】:Update Statement Incorrectly Applying更新语句应用不正确
【发布时间】: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


【解决方案1】:

我敢打赌你是说

WHERE GL.ACTINDX = TR.ACTINDX
  AND (GL.DEBITAMT = TR.DEBITAMT OR GL.CRDTAMNT = TR.CRDTAMNT)
  AND GL.TRXDATE = TR.TRXDATE

【讨论】:

  • 我试过 Blam 会产生与第一个查询相同的错误结果。感谢您的输入。将 OR 替换为 AND 给了我正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多