【问题标题】:Insert with select for multiple records选择多条记录插入
【发布时间】:2018-03-01 12:17:08
【问题描述】:

我有一个插入语句,我想为其创建 2 次插入。我有以下代码:

    INSERT INTO [dbo].[Licemb]
        ([Lic_Id],
        [LicEmb_EmbTS],
        [LicEmb_EmbOffset])

            SELECT TOP 1 
            Lic_ID,
            '00:00:00',
            -7 
            FROM dbo.Lics
            WHERE Org_ID = 2
            ORDER BY NP_ID DESC

            UNION ALL

            SELECT TOP 1 
            Lic_ID,
            '00:00:00',
            -7 
            FROM dbo.Lics
            WHERE Org_ID = 4
            ORDER BY NP_ID DESC

但是我不断收到语法错误,并且在搜索了一段时间后找不到解决方法。

错误:

Incorrect syntax near the keyword 'UNION'.

如何修改此代码,以便我可以使用单个语句通过选择进行 2 次插入?

任何帮助将不胜感激。

【问题讨论】:

  • 标记您正在使用的 dbms。该代码包含特定于产品的功能。
  • 是的,我添加了 INSERT INTO [dbName].[dbo].[Licemb] 但仍然有错误

标签: sql sql-server select insert union


【解决方案1】:

您的整个 union 声明只能有一个 order by。

如果您需要对每个选择进行排序,则需要运行子查询并将它们合并

所以

INSERT INTO [dbo].[Licemb]
            ([Lic_Id],
            [LicEmb_EmbTS],
            [LicEmb_EmbOffset])

            select id,daytime,embargo from (
            SELECT TOP 1 
            Lic_ID      AS id,
            '00:00:00'  AS daytime,
            -7          AS embargo
            FROM [NLASQL].dbo.Lics
            WHERE Org_ID = 2
            ORDER BY NP_ID DESC) 

            UNION ALL

            select id,daytime,embargo from (
            SELECT TOP 1 
            Lic_ID      AS id,
            '00:00:00'  AS daytime,
            -7          AS embargo
            FROM [NLASQL].dbo.Lics
            WHERE Org_ID = 4
            ORDER BY NP_ID DESC) 

这不是一个理想的解决方案,并且会问为什么您需要对每组数据进行排序,然后从那个角度解决问题。

【讨论】:

  • sql server 不允许在子查询中使用order by
  • 仅当未指定 top 时
  • 非常正确,只是刚刚注意到这一点。很抱歉造成混乱。
  • 没问题,我自己也得双管齐下。
  • 我在上面添加了我的更改,但出现以下错误:关键字“UNION”附近的语法不正确。关键字“SET”附近的语法不正确。
【解决方案2】:

如果使用union (all),则只能有一个order by,即在最后一个联合查询之后。此order by 应用于union 中的所有查询。

【讨论】:

  • 好的,但我需要为每个选择排序,那我该怎么办?
  • 在您发布的查询中,两个查询的order by 相同,因此没有问题。如果您希望查询 1 的排序方式与查询 2 的排序方式不同,那么您必须想出一些聪明的办法。例如,您可以为各自的查询使用select 1 as selectionselect 2 as selection。而不是order by selection。这完全取决于您希望如何排序。
  • 也许这可以帮助你stackoverflow.com/questions/5551064/…。您将选择查询放在子查询中
  • 有点晚了,但我只是注意到您也使用top 1,在这种情况下,您可以使用带有order by的子查询
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多