这是一个恼人的问题,我无法弄清楚如何解决它。我正在使用Microsoft SQL Server 2008。
所以我有两个表,我需要更新它们。他们共用一个共同的密钥,比如id。我想用一些内容更新Table1
,然后更新Table2
中分别修改过的Table1
行。
问题是我不太清楚哪些行被修改了,因为我随机选择了ORDER BY NEWID()
,所以我可能无法在JOIN
上使用Table2
办法。我正在尝试保存在Table1
的查询中修改的必要详细信息,并将它们传递给Table2
这就是我要做的事情
CREATE TABLE IDS (id int not null, secondid int)
SELECT [Table1].[id], [Table1].[secondid]
INTO IDS
FROM
(
UPDATE [Table1]
SET [secondid]=100
FROM [Table1] t
WHERE t.[id] IN
(SELECT TOP 100 PERCENT t.[id] FROM [Table1]
WHERE (SOME_CONDITION)
ORDER BY NEWID()
)
)
UPDATE [Table2]
SET some_column=i.secondid
FROM [Table2] JOIN IDS i ON i.id = [Table2].[id]
但是我得到了
关键字'UPDATE'附近的语法不正确。
所以问题是:如何解决语法错误或者这是一种更好的方法呢?
注意:第一个FROM
的括号之间的查询在此新要求之前运行良好,因此我怀疑那里存在问题。或者也许?
编辑:将第二个UPDATE
更改为skk建议仍会导致相同的错误(正好在包含UPDATE
的以下行中):
UPDATE [Table2]
SET some_column=i.secondid
FROM [Task] JOIN IDS i on i.[id]=[Table2].[id]
WHERE i.id=some_value
答案 0 :(得分:3)
SQL Server没有手动创建新表,而是使用OUTPUT子句来帮助解决这个问题。
答案 1 :(得分:1)
更新语法如下
UPDATE TableName SET ColumnName = Value WHERE {Condition}
但你也使用了FROM关键字。
编辑:
您可以更改以下代码,然后重试
UPDATE [Table2] SET some_column=IDS.secondid WHERE IDS.[id] = [Table2].[id] and
IDS.id=some_value
答案 2 :(得分:1)
它抱怨,因为你没有在UPDATE [Table2]
之前的第一个查询中使用的派生表别名。
如果添加别名,则会收到其他错误:
嵌套的INSERT,UPDATE,DELETE或MERGE语句必须具有OUTPUT子句。
这导致回到@Adam Wenger的回答。
我不确定我完全理解你要做什么,但是会执行以下sql(在替换SOME_CONDITION
之后):
CREATE TABLE IDS (id int not null, secondid int)
UPDATE t SET [secondid] = 100
OUTPUT inserted.[id], inserted.[secondid] into [IDS]
FROM [Table1] t
WHERE t.[Id] IN
(
SELECT TOP 100 PERCENT t.[id] from [Table1]
WHERE (SOME_CONDITION)
ORDER BY NEWID()
)
UPDATE [Table2]
SET some_column = i.secondid
FROM [Table2] JOIN IDS i ON i.id = [Table2].[id]