首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mysql中某个条件的join更新记录

使用mysql中某个条件的join更新记录
EN

Stack Overflow用户
提问于 2018-08-16 18:54:16
回答 3查看 33关注 0票数 0

我有两张桌子

代码语言:javascript
复制
utr_details

utr | utr_amt |match_flag(default 0)
1   |10       |0
1   |20       |0
1   |20       |0
2   |30       |0
2   |20       |0
2   |10       |0

export_data
utr | utr_sum_amt
1   | 50
2   | 100

如上所述,UTR1的表utr_details中的utr_amt总和是50,这等于UTR1的导出export_data中的utr_sum_amt。但两个表中UTR2的总和并不相等。我的任务是将match_flag的值更新为1,其中两个tables.In的和相等,本例中表utr_details中的UTR1的match_flag将为1。请帮我生成一个mysql query.Is有可能在一个查询中实现这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-16 19:16:45

也许这里有比严格意义上必要的更多的查询,但是你已经明白了…

代码语言:javascript
复制
DROP TABLE IF EXISTS utr_details;

CREATE TABLE utr_details
(id SERIAL PRIMARY KEY
,utr INT NOT NULL
,utr_amt INT NOT NULL
,match_flag TINYINT NOT NULL DEFAULT 0
);

INSERT INTO utr_details VALUES
(1,1,10,0),
(2,1,20,0),
(3,1,20,0),
(4,2,30,0),
(5,2,20,0),
(6,2,10,0);

DROP TABLE IF EXISTS export_data;

CREATE TABLE export_data
(utr INT NOT NULL PRIMARY KEY
,utr_sum_amt INT NOT NULL
);

INSERT INTO export_data VALUES
(1, 50),
(2,100);

UPDATE utr_details a 
  JOIN 
     ( SELECT x.utr 
         FROM 
            ( SELECT utr
                   , SUM(utr_amt) utr_sum_amt 
                FROM utr_details 
               GROUP 
                  BY utr
            ) x 
         JOIN export_data y 
           ON y.utr = x.utr 
          AND y.utr_sum_amt = x.utr_sum_amt
     ) b 
    ON b.utr = a.utr 
   SET match_flag = 1;
Query OK, 3 rows affected (0.05 sec)

SELECT * FROM utr_details;
+----+-----+---------+------------+
| id | utr | utr_amt | match_flag |
+----+-----+---------+------------+
|  1 |   1 |      10 |          1 |
|  2 |   1 |      20 |          1 |
|  3 |   1 |      20 |          1 |
|  4 |   2 |      30 |          0 |
|  5 |   2 |      20 |          0 |
|  6 |   2 |      10 |          0 |
+----+-----+---------+------------+
票数 1
EN

Stack Overflow用户

发布于 2018-08-16 18:59:45

查询可能如下所示:

代码语言:javascript
复制
UPDATE utr_details 
SET match_flag = 1
WHERE utr IN (
SELECT utr, utr_sum_amt, auto_sum.sum.correct
FROM export_data 
INNER JOIN 
(SELECT utr, SUM(utr_amt) AS sum_correct
FROM utr_details
GROUP BY utr) auto_sum
WHERE utr_sum_amt = auto_sum.sum.correct
)

下面是它的工作原理。

1)计算实际总和:

代码语言:javascript
复制
SELECT utr, SUM(utr_amt) AS sum_correct
FROM utr_details
GROUP BY utr

2)将export_data与这个新的select连接起来,并添加一个WHERE子句,以便只选择和不同的行。

3)使用上面的结果作为过滤器运行UPDATE

票数 0
EN

Stack Overflow用户

发布于 2018-08-16 19:42:18

代码语言:javascript
复制
UPDATE utr_details 
   JOIN (SELECT aggregates.utr 
         FROM   (SELECT utr, Sum(utr_amt) utr_total 
                 FROM   utr_details 
                 GROUP  BY utr) aggregates 
                JOIN export_data 
                  ON aggregates.utr = export_data.utr 
         WHERE  utr_total = utr_sum_amt) aggregates_equal 
     ON aggregates_equal.utr = utr_details.utr 
SET match_flag = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51875343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档