2014-09-23 75 views
0

我有一個BaseProducts表。我想從同一張表的另一行更新一行。這是我試過,但沒有工作的方法,而不是更新用,從同一張表的另一行更新一行?

UPDATE DP 
SET 
    DP.[Description] = SP.[Description] 
    ................................ 
    ................................ 
    ................................ 
    ,[LastModificationDateUtc] = GETUTCDATE() 
FROM  
    [dbo].[BaseProducts] DP 
INNER JOIN 
    [dbo].[BaseProducts] SP ON DP.Id = SP.Id 
WHERE 
    SP.Id = @SourceBaseProductId 
    AND DP.Id = @DestinationBaseProductId; 

我有SourceBaseProductIdDestinationBaseProductId

+1

「但不工作」, - 這意味着什麼? – 2014-09-23 07:25:03

+0

影響0行。 – user960567 2014-09-23 07:25:42

+1

查詢返回的行沒有'update',但只是'select'? – 2014-09-23 07:27:00

回答

1

從我瞭解你並不想使用inner join,但cross join

UPDATE DP 
SET 
    DP.[Description] = SP.[Description] 
    ................................ 
    ................................ 
    ................................ 
    ,[LastModificationDateUtc] = GETUTCDATE() 
FROM  
    [dbo].[BaseProducts] DP 
CROSS JOIN 
    [dbo].[BaseProducts] SP 
WHERE 
    SP.Id = @SourceBaseProductId 
    AND DP.Id = @DestinationBaseProductId; 

在這種情況下,你可以有不同的來源和目的地ID,如您在WHERE子句中爲他們提供。

+0

不錯的作品 – user960567 2014-09-23 07:30:39

1

不需要內連接。這將工作。

  UPDATE DP 
        SET DP.[Description] = SP.[Description] 

      FROM [dbo].[BaseProducts] DP 
        ,[dbo].[BaseProducts] SP 

      WHERE 
       SP.Id = @SourceBaseProductId 
       AND DP.Id = @DestinationBaseProductId; 
0

似乎所有你真正想要做的是這樣的:

UPDATE BaseProducts 
SET Description = 
(
    SELECT Description 
    FROM BaseProducts 
    WHERE ID = @SourceBaseProductId 
) 
WHERE ID = @DestinationBaseProductId; 

只是一個簡單的更新,你可以檢索要設置的值。根本不需要加入。

+0

有多個字段時該怎麼辦?來自OP的查詢似乎表明這一點。 – 2014-09-23 07:37:19

+0

@Patrick Hofman:啊,你說得對。 AFAIK,SQL Server無法處理諸如「SET(Description,Price)=(SELECT Description,Price FROM ...)」這樣的元組,這是標準的SQL IIRC。所以是的,對於SQL Server,你需要一個連接。 – 2014-09-23 07:58:28

+0

只是查了一下。使用元組進行更新(多列分配)是SQL 2003的標準版本,而SQL Server尚未提供此功能。 – 2014-09-23 08:08:36

相關問題