8

Microsoft SQL Server ManagementStudio2008を使用しています。簡単なトランザクションを実行しました。

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から取得する行よりも1行少なく影響します。

(影響を受ける61行)

(影響を受ける60行)

(影響を受ける0行)

ここで何が欠けていますか?

4

2 に答える 2

2

最も可能性の高い理由は、例のTable_aに重複するIDが含まれる行があることだと思います。この場合、最初の結合に追加の行が表示されますselectupdate、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
于 2010-10-05T15:36:40.890 に答える
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

ターゲットテーブルの行のソースに一致するものが2つあり、最終的にどの値がターゲットを更新するかを事前に知ることはできません。

于 2010-10-05T14:20:17.463 に答える