使用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)受影响)
我在这里缺少什么?
答案 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
目标表中的行在源中有两个匹配项,我们无法预先知道哪个值最终会更新目标。