【问题标题】:SQL insert based on select with multiple results基于多结果选择的 SQL 插入
【发布时间】:2016-02-25 21:03:00
【问题描述】:

我正在尝试根据单独表中的值插入到表中。

这是我正在起草并收到错误的脚本:“子查询返回超过 1 个值”

insert into tableproducts (proditemid,
prodprintlabel,
prodid) 
values (
(select i.itemid from tableitems i where i.itemorigin = 'NJ'),
'F',
(select max(p2.prodid)+1 from tableproducts p2)
)

我希望的结果是任何来自 NJ 的商品都有使用唯一 ID 创建的产品。

Ex: 
ItemID | ItemName | ItemOrigin
001       Item1       NY
002       Item2       NJ
003       Item3       NJ

Take ItemID 002 & 003 and insert into Products
ProdItemID | ProdPrintLabel | ProdID
005            T               010   (existing)
002            F               011   (new Item2)
003            F               012   (new Item3)

提前感谢您提供的任何指导。

-切塔

【问题讨论】:

  • 第一个子选择返回多条记录,第二个只返回1条
  • @Hugo Jones 没错
  • 您使用的是哪个 rdbms - Oracle、SqlServer?
  • @Shawn Iachetta,你测试我的答案了吗

标签: sql select insert


【解决方案1】:

很难准确地说出您要在这里完成什么。但是,您的第一个子查询不限于一个结果。您可以像使用第二个子查询一样向其添加 MAX()。

【讨论】:

  • 我很抱歉含糊不清。我已经更新了一个例子。希望它能更好地解释我想要完成的工作
【解决方案2】:

我怀疑正在尝试写这样的东西:

insert into tableproducts(proditemid, prodprintlabel, prodid) 
    select i.itemid , 'F', coalesce(m.maxprodid, 1)
    from tableitems i cross join
         (select max(prodid) as maxprodid from tableproducts) m
    where i.itemorigin = 'NJ';

如果是这样,这是创建顺序枚举列的错误方法。它应该被声明为auto_increment。上述查询受竞态条件限制。

【讨论】:

【解决方案3】:

如果你正在使用 sqlserver 并且你不想使用自动增量,你可以编写这样的代码

insert into tableproducts (proditemid,prodprintlabel,prodid)
select i.itemid
,'F'
, ROW_NUMBER() OVER( order by i.itemid )+(select coalesce( max(p2.prodid),0)+1 from tableproducts p2 )
 from tableitems i where i.itemorigin = 'NJ'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 2017-08-30
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多