【问题标题】:SQL Migration Script: Insert into, but multiple Select FromSQL 迁移脚本:插入,但有多个 Select From
【发布时间】:2014-04-09 19:39:35
【问题描述】:

我正在尝试将多行插入到一个表中,我基本上想要一个嵌套循环。我有以下建议的代码:

with Permissions (Id) as
(
    select Id from Surge.Permission  where Name in (
        'Web.Orders:Enable',
        'App.Orders:Enable',
        'Web.Orders:View',
        'App.Orders:View',
        'Web.Orders:Modify',
        'App.Orders:Modify',
        'Web.Orders:View.All',
        'App.Orders:View.All'
    )
)

insert Surge.[RolePermission] (DataPartitionId, PermissionId, RoleId)
select DP.Id, Permissions.Id, 2 from Surge.DataPartition as DP

不过,这似乎不对(而且 LINQPad 似乎不喜欢它;它似乎找不到 Permissions.Id)。我将如何使用常规 SQL 执行此操作?基本上,我希望输出是:

1, 1, 2
1, 2, 2,
1, 3, 2
...
2, 1, 2
2, 2, 2
2, 3, 2

等等,就像一个嵌套循环。

【问题讨论】:

  • cte 的目的是什么?您没有在插入/选择语句中引用它。
  • @GoatCO 我已经编辑了代码。我有一些错误,我可能错误地复制了我同事给我的原始 sn-p 的一部分。
  • 您的编辑摆脱了讨厌的 (id,2),但仍然没有在选择中引用 cte。
  • with Permissions 即所谓的 CTE
  • SQL WITH 构造是公用表表达式 (CTE)。

标签: sql sql-server select insert


【解决方案1】:

根据您想要Permission.IDDataPartition.ID 的每种组合的样本数据进行猜测:

with Permissions as
   (select Id 
    from Surge.Permission  
    where Name in ('Web.Orders:Enable',
                   'App.Orders:Enable',
                   'Web.Orders:View',
                   'App.Orders:View',
                   'Web.Orders:Modify',
                   'App.Orders:Modify',
                   'Web.Orders:View.All',
                  'App.Orders:View.All'
                  )
     )
INSERT INTO Surge.[RolePermission] (DataPartitionId, PermissionId, RoleId)
SELECT DP.Id, p.Id, 2 
FROM Surge.DataPartition as DP
CROSS JOIN Permissions p

如果不是这样,您可以将CROSS JOIN 更改为另一个JOIN 类型并添加条件。

【讨论】:

  • 这成功了!我之前尝试过 JOIN 语句,但遇到了一些问题——我想我做错了什么。不过,交叉连接工作​​得很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 2021-11-15
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多