【问题标题】:Select and Update are returning/updating different number of records with same joinSelect 和 Update 正在返回/更新具有相同连接的不同数量的记录
【发布时间】:2014-09-28 06:35:39
【问题描述】:

请原谅我的冗长问题,但我更多的是寻找故障排除建议。 A.DR_CRB.DR_CR 都有 distinct'D''C' 我想审计表 A 中值将被更改的记录数(D 到 C 或反之亦然)因此我写了以下在更新语句之前选择。连接键 IDSRC_TRAN_ID 在两个表中都不是唯一的。

select 语句显示更新为借方(CR_TO_DB) 的贷方计数为 588017 DB_TO_CR 是 924119

但是当我使用相同的连接条件运行更新时,我看到更新到借方的信用数比上述CR_TO_DB 的选择结果少 3257,同样,DB_TO_CR 计数比 924119 多 3257。

我无法解决为什么更新不会更新具有相同连接条件的选择返回的记录数。请帮忙。

SELECT 
(CASE WHEN A.DR_CR != B.DR_CR AND A.DR_CR = 'C' AND B.DR_CR='D' THEN 1 END) CR_TO_DB
,(CASE WHEN A.DR_CR != B.DR_CR AND A.DR_CR = 'D' AND B.DR_CR='C' THEN 1 END) DB_TO_CR
INTO MTL_REPORT
FROM #STAGING_TRANSACTIONS A
JOIN #CLEAN_MTL_UPDATE B
ON A.SRC_TRANID = B.SRC_TRANID
AND A.ID = B.ID


UPDATE A
        SET
        A.DR_CR = B.DR_CR
        FROM #STAGING_TRANSACTIONS A
        JOIN #CLEAN_MTL_UPDATE B
        ON A.SRC_TRANID = B.SRC_TRANID
        AND A.ID = B.ID

【问题讨论】:

  • SRC_TRANID 和 ID 对在您的一个或两个临时表中多次存在。更新将过滤到唯一键并仅报告已更新的实际记录数,而选择将从 A 的角度报告可能重复的记录。对您的两个临时表尝试此查询。如果其中任何一个返回记录,则您有重复的结果。 SELECT ID, SRC_TRANID, COUNT() FROM #STAGING_TRANSACTIONS GROUP BY ID, SRC_TRANID HAVING COUNT() > 1;

标签: sql sql-server select join sql-update


【解决方案1】:

我将用较小的数据集用更简单的术语来解释它。鉴于这两个表:

CREATE TABLE TableA (Col1 INT, Col2 INT, Col3 VARCHAR(10))
CREATE TABLE TableB (Col1 INT, Col2 INT, Col3 VARCHAR(10))

INSERT INTO TableA (Col1, Col2, Col3) VALUES (1, 1, 'a')
INSERT INTO TableA (Col1, Col2, Col3) VALUES (1, 1, 'b')
INSERT INTO TableA (Col1, Col2, Col3) VALUES (1, 2, 'c')

INSERT INTO TableB (Col1, Col2, Col3) VALUES (1, 1, 'd')
INSERT INTO TableB (Col1, Col2, Col3) VALUES (1, 1, 'e')
INSERT INTO TableB (Col1, Col2, Col3) VALUES (1, 2, 'f')

此查询将为您提供 5 行,因为 Col1=1, Col2=1 在两个表上都存在两次。

SELECT *
FROM TableA
JOIN TableB ON TableA.Col1 = TableB.Col1 AND TableA.Col2 = TableB.Col2

你会得到这样的 Col3 对:

a, d
b, d
a, e
b, e
c, f

使用相同连接的 UPDATE 语句实质上会过滤掉唯一记录并仅报告它们。毕竟,您想知道有多少记录受到影响。

【讨论】:

  • 感谢您的解释。所以如果我从两个表中删除重复的行,我的更新计数和审计计数会匹配吗?
  • 我想是的。但这对你重要吗?
  • 这对我来说很重要,因为我不仅要检查更新计数,还要检查值更改的计数(从 D 到 C,反之亦然)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
相关资源
最近更新 更多