【问题标题】:update columns using select statement使用 select 语句更新列
【发布时间】:2017-05-15 15:00:31
【问题描述】:

我想根据您在下面找到我的查询的 select 语句的结果更新列,我的代码无法正常工作: 我在所有列上都得到相同的数据

update ACHATS  b set 
QUANTITE=(select sum(QUANTITE)     from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) M_ID_ACHAT from ACHATS) 
group by a.NUMERO_D_ACHAT) ,
PRIX_HT=(select sum(PRIX_HT)       from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) M_ID_ACHAT from ACHATS) 
group by a.NUMERO_D_ACHAT),
PRIX_TTC=(select sum(PRIX_HT) from ACHAT_DETAILS a where a.NUMERO_D_ACHAT=(SELECT max(ID_ACHAT) M_ID_ACHAT from ACHATS) 
group by a.NUMERO_D_ACHAT);

【问题讨论】:

  • 请提供“无法正常工作”的更多详细信息。你有错误吗?输出是什么?它有什么问题?期望的输出是什么?
  • 没有错误但所有结果都一样
  • 抱歉,但“结果相同”并不提供信息。或许阅读:stackoverflow.com/help/how-to-ask
  • 请勿将您的代码提供给我们进行调试。首先给出示例源数据、您想要获得的结果以及您的意图的可读描述,以及您希望以这种方式处理数据的原因。当我查看您的代码时,我无法阅读您的记忆和想法,这可能无论如何都无法按您的意愿工作。
  • 你应该看看MERGE

标签: sql select firebird


【解决方案1】:

问题的正确更新查询是:

update ACHATS b set 
  QUANTITE = (select sum(QUANTITE)
                from ACHAT_DETAILS a 
                where a.NUMERO_D_ACHAT = (
                  select max(ID_ACHAT)
                    from ACHATS)
             ),
  PRIX_HT = (select sum(PRIX_HT)
               from ACHAT_DETAILS a 
               where a.NUMERO_D_ACHAT = (
                 select max(ID_ACHAT)  
                   from ACHATS)
            ),
  PRIX_TTC = (select sum(PRIX_HT)  
                from ACHAT_DETAILS a 
                where a.NUMERO_D_ACHAT = (
                  select max(ID_ACHAT)
                  from ACHATS)
             )
  where b.ID_ACHAT = (select max(ID_ACHAT)
                        from ACHATS)

【讨论】:

    【解决方案2】:

    因此,要对此进行测试,请尝试以下代码,看看这是否是您希望首先用于更新表格的结果:

       WITH B AS (
        SELECT  MAX(M_ID_ACHAT) AS NUMERO_D_ACHAT
              , SUM(QUANTITE) AS QUANTITE
              , SUM(PRIX_HT) AS PRIX_HT
              , SUM(PRIX_TTC) AS PRIX_TTC
        FROM    ACHAT_DETAILS
        GROUP BY 
            MAX(M_ID_ACHAT)
        )
    
    
    SELECT
        b.QUANTITE
        ,b.PRIX_HT
        ,b.PRIX_TTC
    FROM ACHAT_DETAILS a
    JOIN  b
        ON a.NUMERO_D_ACHAT = b.NUMERO_D_ACHAT
    

    接下来,如果一切看起来都不错,那么您可以运行它(我认为我的语法正确):

    WITH A AS (
    SELECT  MAX(M_ID_ACHAT) AS NUMERO_D_ACHAT
          , SUM(QUANTITE) AS QUANTITE
          , SUM(PRIX_HT) AS PRIX_HT
          , SUM(PRIX_TTC) AS PRIX_TTC
    FROM    ACHAT_DETAILS
    GROUP BY 
        MAX(M_ID_ACHAT)
    )
    
    
    MERGE INTO ACHATS AS u
        USING A
        ON u.NUMERO_D_ACHAT = a.NUMERO_D_ACHAT
        WHEN MATCHED THEN
            UPDATE 
                SET 
                 u.QUANTITE = a.QUANTITE
                ,u.PRIX_HT = a.PRIX_HT
                ,u.PRIX_TTC = a.PRIX_TTC
    

    【讨论】:

    • 语法不正确。 UPDATE ... SET ... FROM ... - UPDATE 语句中没有 FROM 子句。 firebirdsql.su/doku.php?id=update 也许您想使用的是 MERGE。 firebirdsql.su/doku.php?id=merge
    • 嗨 Arioch....这确实运行了,我运行了一个测试 :-) 这样您就可以过滤结果或使用连接进行更新
    • 完整查询、firebird 版本和屏幕截图,如果您愿意的话:我确信您的第二个来源文本不完整,并且与您实际运行的内容不完全匹配。或者您使用其他一些不是 firebird 的 RDBMS 进行测试
    • 感谢第一个代码的回复,他给出了正确的数据,但第二个代码在 firebird 上不起作用,给出错误:令牌未知 - 第 5 行,第 1 列。来自。 SQL 错误(代码 = -104):令牌无效。
    • 我试过了,还是不行(我在Firebird数据库下工作)
    猜你喜欢
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多