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

时间:2010-10-05 14:01:58

标签: sql-server tsql 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

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

(61行(s)受影响)

(60行受影响)

(0行(s)受影响)

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我怀疑最可能的原因是您的示例中的Table_a中有一个行中包含重复ID的行 - 这意味着您的第一个select中的联接中会出现另一行,但{{{ 1}}只处理Table_b中的行,因此您的重复行无关紧要。这句话应该给你罪魁祸首:

update

答案 1 :(得分:0)

UPDATE ... FROM没有检测到像这样的含糊不清:

CREATE TABLE dbo.source
    (
      id INT NOT NULL ,
      SomeNumber INT
    )
GO
CREATE TABLE dbo.target
    (
      id INT NOT NULL
             PRIMARY KEY ,
      SomeNumber INT
    )
GO
INSERT  INTO dbo.source
        ( id, SomeNumber )
        SELECT  1 ,
                2
        UNION ALL
        SELECT  1 ,
                3

INSERT  INTO dbo.target
        ( id, SomeNumber )
        SELECT  1 ,
                0

UPDATE  dbo.TARGET
SET     SomeNumber = s.SomeNumber
FROM    dbo.source AS s
        JOIN dbo.TARGET AS t ON s.id = t.id

目标表中的行在源中有两个匹配项,我们无法预先知道哪个值最终会更新目标。