【问题标题】:SQL Server update a table based on values in the same tableSQL Server 根据同一表中的值更新表
【发布时间】:2015-08-06 19:52:54
【问题描述】:

是否可以使用同一列中的值更新表中的列?更新取决于按正确顺序选择的行。

我试过的查询如下:

UPDATE myTable
SET language = (SELECT language FROM myTable t2
        WHERE t1.book = t2.book
        AND t1.firstRun = t2.lastRun + 1)
FROM myTable t1
WHERE language = '--'

结果是在少数情况下我最终将语言设置为 NULL。

我的桌子是这样的:

book    | firstRun    | lastRun    | language
----------------------------------------------
b1      | 1           | 4          | English
b1      | 5           | 9          | --
b1      | 10          | 25         | French
b1      | 26          | 28         | --

需要的输出:

book    | firstRun    | lastRun    | language
----------------------------------------------
b1      | 1           | 4          | English
b1      | 5           | 9          | English
b1      | 10          | 25         | French
b1      | 26          | 28         | French

【问题讨论】:

  • 有可能,您的更新声明对我来说似乎没问题。您可能会在与子查询不匹配的行中得到空值。
  • 您的更新查询似乎运行良好,就像@ZoharPeled 所说的那样。 sqlfiddle.com/#!3/e0194/1/0
  • 感谢您的回复。它适用于像这样的小玩具桌。但我发现在我的大表上,行的顺序可能不同,它不能正确更新行。有些行保留为“--”
  • 也许你可以分配一个row_number()

标签: sql-server sql-update


【解决方案1】:

您能否包含一些语言以 NULL 结尾的结果行?还有那些行以前的样子?

要以 NULL 结尾,子查询中的 JOIN 必须生成 0 行,或者“myTable”中已经有语言为 NULL 的行。

附:缩进和清理代码更容易:

UPDATE 
    myTable
SET 
    myTable.language = t2.language 
FROM 
    myTable t2
WHERE 
    myTable.language    = '--' AND
    myTable.book        = t2.book AND
    myTable.firstRun    = t2.lastRun + 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多