使用复杂的WHERE语句更新表

时间:2014-06-05 18:22:49

标签: sql sql-server sql-server-2008

我有两个表: WebPages (包括父网站ID)和结果(包括父网页ID)。

我想编写一个存储过程,为所有具有特定网站ID 的记录更新“ FirstSeen 列。

例如(此代码不起作用):

CREATE PROCEDURE [dbo].[MySP]
    @SiteId int
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [dbo].[Results]
        SET [dbo].[Results].[FirstSeen] = GetDate()
        WHERE [dbo].[WebPages].[Id] = [dbo].[Results].[WebPages_Id] AND [dbo].[WebPages].[WebSites_Id]=@SiteId

END
GO

我收到了这些错误:

Msg 4104, Level 16, State 1, Procedure MarkAllResultsAsReaded, Line 10
The multi-part identifier "dbo.WebPages.Id" could not be bound.
Msg 4104, Level 16, State 1, Procedure MarkAllResultsAsReaded, Line 10
The multi-part identifier "dbo.WebPages.WebSites_Id" could not be bound.

你知道如何解决这个问题吗?

我正在使用SQL-Server 2008。

3 个答案:

答案 0 :(得分:2)

如果没有明确地在连接中使用,则不能在更新中使用当前表以外的表,如下所示:

UPDATE r
    SET r.[FirstSeen] = GetDate()
FROM [dbo].[Results] r
INNER JOIN [dbo].[WebPages] p ON p.[Id] = r.[WebPages_Id]
WHERE p.[WebSites_Id]=@SiteId

您需要加入的原因是您的UPDATE引用了两个表格 - ResultsWebPages

答案 1 :(得分:1)

您想要加入这两个表并执行UPDATE,如下所示,因为您实际上正在尝试更新Results表中webpages表中存在匹配记录的所有行。

UPDATE r
    SET [FirstSeen] = GetDate()

    FROM [dbo].[Results] r
    JOIN [dbo].[WebPages] w
    ON w.[Id] = r.[WebPages_Id] 
    AND w.[WebSites_Id]=@SiteId

答案 2 :(得分:0)

你做一个子查询:

UPDATE [dbo].[Results]
SET [dbo].[Results].[FirstSeen] = GetDate()
WHERE [Results].[WebPages_Id] IN (Select [WebPages].[Id] From [dbo].[WebPages]Where [WebPages].[WebSites_Id]=@SiteId)

JOIN会为您提供更好的效果,如其他答案所示。