Sql-Server

僅使用外鍵條件更新表中最舊的條目

  • March 8, 2014

我在一個論壇網站上工作。

我想要做的是更新執行緒標題和內容(第一篇文章),它們位於不同的表中 - “執行緒”和“文章”。

“執行緒”

執行緒表

“文章”

文章表

我不確定如何僅更新“文章”中最舊的條目,其中“文章”中的外鍵與執行緒中的 ID 匹配。

我從來沒有真正嘗試過帶有子查詢的高級 UPDATE 語句,這還不是我最強的技能之一。

這是我嘗試過的(更新了“文章”表中的所有行):

   UPDATE Threads 
   SET Title = @ThreadTitle 
   WHERE Id = @Id;

   UPDATE Posts 
   SET Content = @Content 
   WHERE 
       (SELECT TOP 1 FkThreadId FROM Posts 
        WHERE FkThreadId = @Id 
        ORDER BY CreationTime ASC)= @Id 

也可以更新連接表而不是使用 2 個語句,還是編寫 2 個單獨的語句更好?

版本:

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 2012 年 12 月 28 日 20:23:12 版權所有 (c) Microsoft Corporation Express Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service Pack 1)

是的,您的查詢將更新posts. 您必須包含一個將更新限制為一行的條件。一種方法:

UPDATE Posts 
SET Content = @Content 
WHERE Id = 
   (SELECT TOP 1 Id 
    FROM Posts 
    WHERE FkThreadId = @Id 
    ORDER BY CreationTime ASC) ;

在 SQL-Server 中,您不能在一個語句中更新兩個表,因此您必須使用兩個語句。不過,您可以將它們放在事務中,因此它們被視為原子,它們要麼成功要麼失敗。

引用自:https://dba.stackexchange.com/questions/60466