什么可能导致'受影响的行'不正确?

Ind*_*rek 8 t-sql sql-server select rows-affected

使用Microsoft SQL Server Management Studio 2008.我做了一个简单的事务:

BEGIN TRAN

SELECT ko.ID, os.ID AS ID2
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);

UPDATE table_b SET the_date=ko.the_date
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);

SELECT ko.ID, os.ID AS ID2
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL);


ROLLBACK
Run Code Online (Sandbox Code Playgroud)

所以SELECT和UPDATE应该是一样的.结果应该返回0行.但UPDATE影响的一行少于SELECT从DB获取的行:

(61行受影响)

(60排受影响)

(0行(s)受影响)

我在这里错过了什么?

Sql*_*yan 2

我怀疑最可能的原因是您的示例中的 Table_a 有一行包含重复的 ID - 这种情况下,您的第一个连接中会出现额外的行select,但update只处理 Table_b 中的行,因此您的重复行并不重要。这个声明应该告诉你罪魁祸首:

SELECT ko.ID
FROM table_a AS ko
JOIN table_b AS os ON os.ID=ko.ID
WHERE (ko.the_date IS NOT NULL AND os.the_date IS NULL)
GROUP BY ko.ID
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)