使用 select 语句更新列

update columns using select statement

我想根据 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);

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

   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 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)