【问题标题】:Create table from SQL query从 SQL 查询创建表
【发布时间】:2011-11-17 10:46:47
【问题描述】:

这是一个烦人的问题,我不知道如何解决它。我正在使用 Microsoft SQL Server 2008。

所以我有两个表,我需要更新它们。它们共享一个公共密钥,比如 id。我想用一些东西更新Table1,然后更新Table2分别在Table1中修改的行。

问题是我不太清楚哪些行被修改了,因为我用ORDER BY NEWID() 随机选择它们,所以我可能无法以任何方式在Table2 上使用JOIN。我正在尝试保存在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 括号之间的查询在这个新要求之前运行良好,所以我怀疑那里有问题。或者也许?

编辑:按照 skk 的建议更改第二个 UPDATE 仍然会导致相同的错误(恰好在下面包含 UPDATE 的行上):

UPDATE [Table2]
SET some_column=i.secondid
FROM [Task] JOIN IDS i on i.[id]=[Table2].[id]
WHERE i.id=some_value

【问题讨论】:

  • 您是否尝试过使用触发器。我知道它有自己的性能相关问题,但它可能会简化整个任务。
  • 为什么要随机修改行?

标签: sql sql-server-2008 select sql-update


【解决方案1】:

SQL Server 没有手动创建新表,而是使用 OUTPUT 子句来帮助完成此操作

【讨论】:

    【解决方案2】:

    之所以抱怨,是因为您没有为第一个查询中使用的派生表设置别名,紧接在 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]
    

    【讨论】:

    • 谢谢,这正是我所做的。
    【解决方案3】:

    更新语法如下

        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  
    

    【讨论】:

    • 但是 UPDATE 块使用 FROM 执行得很好。我尝试将其删除,但仍然出现相同的错误。
    • 如果您的UPDATE 语句中有FROM table1 AS t1,只要您还引用别名UPDATE t1,它就可以工作
    • @skk 哦,我明白了,这是关于第二次更新。如果我在那里添加 WHERE {CONDITION},我仍然会收到该错误。
    • @skk 仍然是同样的问题,它没有通过更新
    • @Kaisar,首先做一件事,将大查询中的所有查询放在一边,然后分别尝试每个查询。然后你就知道哪个查询有错误了。
    猜你喜欢
    • 2013-09-11
    • 2013-09-24
    • 2015-02-15
    • 2017-06-05
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-09-02
    相关资源
    最近更新 更多