【问题标题】:INSERT INTO ...SELECT syntax error in join operator连接运算符中的 INSERT INTO ...SELECT 语法错误
【发布时间】:2012-06-25 17:54:08
【问题描述】:

我正在尝试将购物篮写入来自 C# asp.net 的 sql 数据库中的订单 + 订单行。 订单行将包含购物篮中每件商品的订单编号、总价、产品编号、数量等。订单本身将包含订单号作为主键,并将通过它链接到不同的行。 昨天一切正常,但现在当我尝试在 insert into 语句中使用 SELECT 命令以使事情变得更加动态时,我得到了上述语法错误。

有人知道这句话有什么问题吗:

INSERT INTO [order] 
        (klant_id,totaalprijs,btw,subtotaal,verzendkosten)
SELECT  klant.id
,       SUM(orderregel.totaalprijs)
,       SUM(orderregel.btw)
,       SUM(orderregel.totaalprijs) - SUM(orderregel.btw)
,       7.50 
FROM    orderregel
INNER JOIN  
        klant 
ON      [order].klant_id = klant.id  
WHERE   klant.username = 'jerry' 
GROUP BY 
        id;

“订单”表中的订单号在自动编号上,在 asp 代码隐藏中,有一个 for each 用于处理为每个产品编写的行,在此循环之外有一个索引设置为 0,并且每增加一个 1结束它。订单的executenonquery只在第一个循环开始时执行一次,后面加上MAX(ordernumber)作为ordernumber的行。

我希望我提供了足够的信息并且有人能够帮助我。 提前致谢!

编辑: 谢谢大家,使用这个查询就可以了!

插入 [订单] (klant_id,totaalprijs,btw,subtoaal,verzendkosten) SELECT (SELECT klant.id FROM klant WHERE klant.username = 'jerry') ,
SUM(orderregel.totaalprijs) , SUM(orderregel.btw) ,
SUM(orderregel.totaalprijs) - SUM(orderregel.btw) , 7.50 FROM
订单regel;

【问题讨论】:

  • 您的 EDIT 查询将不起作用。尝试插入两个订单。然后检查您的第二个订单的totaalprijs 是否正确。
  • 嗯,是的,我注意到了,你在这里看到修复了吗?我现在尝试一个人做,但整天忙于工作,回家后编程对我艰难的过程来说不太好;)
  • 您必须弄清楚如何插入订单和订单行之间的关系。我的回答中有一个可能的解决方案。我会在上面睡一晚:)
  • 好的,谢谢伙计,也许这是最好的。我已经很久没有编程了,但没过多久我就时不时地找出休息时间,然后真的给你新的想法和对事物的看法!

标签: c# asp.net sql


【解决方案1】:

您在 JOIN 中使用了 [order],我猜应该是 orderregel

FROM    orderregel
    INNER JOIN klant ON [order].klant_id = klant.id 

应该是:

FROM    orderregel
    INNER JOIN klant ON orderregel.klant_id = klant.id 

编辑:

为什么不直接使用:

INSERT INTO [order] 
        (klant_id,totaalprijs,btw,subtotaal,verzendkosten)
SELECT  (SELECT klant.id FROM klant WHERE klant.username = 'jerry')
,       SUM(orderregel.totaalprijs)
,...

...并避免与 klant 表 JOIN?

【讨论】:

  • 另外,还有GROUP BY id,不提表,这也可能导致错误(如果有多个表,列“id”在使用中)
  • “klant”是荷兰语的客户;订单行不太可能与客户有关系。
  • 这就是为什么我用“also”开始评论的原因,因为(a)他可能会在修复第一个错误后看到这个,(b)因为在处理连接聚合时值得一提;)跨度>
  • @Andomar - 有道理,但问题并不清楚 - 对于非荷兰语人士:)
  • 感谢您的反应,问题是orderregel 没有klant.id,它是在写入订单时读取的客户ID,以决定向哪个客户写入订单。我已经尝试在 select 内的语句加入 order 中使用第二个内部联接,但为此我必须在 order.ordernummer = orderregel.ordernummer 上执行它,此时在后面的代码中尚未创建。
【解决方案2】:

您不能引用要插入的表。毕竟,在插入完成之前这些行还不存在!

阅读您的查询,很明显您正在尝试插入名为Jerryklant。但是如何指定插入使用的订单行呢?

一个可能的解决方案:

  1. 先写订单,加上klant id
  2. 创建订单行。您知道第一个查询的 orderid(例如使用 select SCOPE_IDENTITY()
  3. 使用总计更新订单

【讨论】:

  • 感谢您的反应,您绝对在这里。我正在从 C# 代码隐藏 user.authenticated 内置功能中读取客户的用户名。有什么方法可以在 klant.username = 'jerry' 上进行 INNER JOIN klant 我将在代码隐藏中移动参数然后...
【解决方案3】:

试试这个: 插入 [订单] (klant_id,totaalprijs,顺便说一句,小计,verzendkosten) 选择 klant.id ,总和(orderregel.totaalprijs) ,总和(orderregel.btw) , SUM(orderregel.totaalprijs) - SUM(orderregel.btw) , 7.50 FROM orderregel 内连接 klant ON orderregel.id = klant.id
INNER JOIN [order] ON [order].klant_id = klant.id
WHERE klant.username = '杰瑞' 按 ID 分组;

【讨论】:

    猜你喜欢
    • 2014-02-07
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多