首页 > 解决方案 > 带有一个子查询的 MYSQL 更新

问题描述

SELECT account_no,
       dater
FROM   tbl_margin_all
WHERE  dater = '01/08/18'
GROUP  BY account_no,
          dater

这给了我 149 行的结果。我现在想将这些结果复制到一个空表中。

UPDATE tbl_margin_date t2,
       (SELECT account_no,
               dater
        FROM   tbl_margin_all
        WHERE  dater = '01/08/18'
        GROUP  BY account_no,
                  dater) t1
SET    t2.dater = t1.dater

以上不起作用,我不明白为什么。dater 只是一个包含日期的字符串。dater 的两个表都是 varchar(8)。Account_no 对于两者都是 varchar(6)。我不认为我可以加入,因为 tbl_margin_date 是空的。我试过加入,但没有奏效。它只返回了零行受影响。与上述带有子查询的查询相同

UPDATE tbl_margin_date t2
       JOIN (SELECT account_no,
                    dater
             FROM   tbl_margin_all
             WHERE  dater = '01/08/18'
             GROUP  BY account_no,
                       dater) t1
         ON t2.dater = t1.dater
            AND t2.account_no = t1.account_no
SET    t2.dater = t1.dater 

不知道为什么至少我的子查询更新不起作用。谢谢

添加 。请注意,我认为我需要使用 GROUP,因为我想从 tbl_margin_all 中选择其他列,例如 Count(consignment_number) AS cons。我很抱歉!

原来我的问题是我使用的是更新而不是插入!

INSERT INTO tbl_margin_date (dater, account_no, cons)
SELECT dater, account_no, COUNT(cons) FROM tbl_margin_all WHERE dater='2018-01-02'
GROUP BY account_no, dater

所以上面的查询对我有用

标签: mysql

解决方案


如果您没有聚合函数,首先建议不要使用 grup by,在这种情况下,您可以使用 DISTINCT 子句

UPDATE tbl_margin_date t2
JOIN (
  SELECT  distinct account_no,
          dater
  FROM   tbl_margin_all
  WHERE  dater = '01/08/18'
 ) t1  ON t2.dater = t1.dater
        AND t2.account_no = t1.account_no
SET    t2.dater = t1.dater 

其次,您的更新代码是使用子查询的 dater 列结果更新列 dater 但在子查询中,您使用 where with dater = '01/08/18' ...这等于 set t2.dater = '01 /08/18'

您是否可以在更新列 dater 之后更新其他列,或者您只是想在表 tbl_margin_date 中插入子查询的结果

那么你应该使用

insert into  tbl_margin_date  (accont_no, dater)
SELECT  distinct account_no,     dater
FROM   tbl_margin_all
WHERE  dater = '01/08/18'

推荐阅读