MYSQL 重复行的复杂更新

标签 mysql sql duplicates

我有一个非常复杂的表格,如下所示:-

Snos   Column1 Column2 Column3 Column4 Column5 Column6
1      AD       AD1     C1      2011    P1     6435200
2      AD       AD1     C1      2010    P1     234
3      AD       AD1     C1      2009    P1     6435
4      BD       AD2     C2      2010    P2     198448333
5      CD       AD3     C3      2011    P3     194414870

现在,我需要处理一个应该重复一行的查询,其中假设 p2,p3 或 p1,p2 甚至只是 p2 值在该特定年份或 2009 年、2010 年或 2011 年中不可用,并放在最后列的值为零。

现在我的数据库应该是这样的 -

Snos   Column1 Column2 Column3 Column4 Column5 Column6
1      AD       AD1     C1      2011    P1     6435200
2      AD       AD1     C1      2010    P1     234
3      AD       AD1     C1      2009    P1     6435
4      AD       AD1     C1      2011    P2     0
5      AD       AD1     C1      2010    P2     0
6      AD       AD1     C1      2009    P2     0
7      AD       AD1     C1      2011    P3     0
8      AD       AD1     C1      2010    P3     0
9      AD       AD1     C1      2009    P3     0
10     BD       AD2     C2      2010    P2     198448333
11     BD       AD2     C2      2009    P2     0
12     BD       AD2     C2      2011    P2     0
13     BD       AD2     C2      2010    P1     0
14     BD       AD2     C2      2009    P1     0
15     BD       AD2     C2      2011    P1     0
16     BD       AD2     C2      2010    P3     0
17     BD       AD2     C2      2009    P3     0
18     BD       AD2     C2      2011    P3     0
19     CD       AD3     C3      2011    P3     194414870
20     CD       AD3     C3      2009    P3     0
21     CD       AD3     C3      2010    P3     0
22     CD       AD3     C3      2011    P1     0
23     CD       AD3     C3      2009    P1     0
24     CD       AD3     C3      2010    P1     0
25     CD       AD3     C3      2011    P2     0
26     CD       AD3     C3      2009    P2     0
27     CD       AD3     C3      2010    P2     0

我尝试使用临时表,例如


    CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE *Some Condition*;
    Some If Else
    Then
    UPDATE tmptable_1 SET Column6 = 0;
    INSERT INTO table SELECT * FROM tmptable_1;
    DROP TEMPORARY TABLE IF EXISTS tmptable_1;

但它不起作用。谁能帮帮我。

最佳答案

假设 UNIQUE 约束为 (Column1,Column2,Column3,Column4,Column5)

CREATE TEMPORARY TABLE tmp LIKE your_table;

INSERT IGNORE INTO tmp (Column1,Column2,Column3,Column4,Column5,Column6)
SELECT t1.Column1,t2.Column2,t3.Column3,t4.Column4,t5.Column5, 0
FROM 
    (SELECT DISTINCT Column1 FROM your_table) as t1,
    (SELECT DISTINCT Column2 FROM your_table) as t2, 
    (SELECT DISTINCT Column2 FROM your_table) as t2, 
    (SELECT DISTINCT Column4 FROM your_table) as t4,
    (SELECT DISTINCT Column5 FROM your_table) as t5;

UPDATE tmp JOIN your_table ON
    tmp.Column1 = your_table.Column1
    tmp.Column2 = your_table.Column2 AND
    tmp.Column3 = your_table.Column3 AND
    tmp.Column4 = your_table.Column4 AND
    tmp.Column5 = your_table.Column5 AND
SET tmp.Column6 = your_table.Column6;

这应该会在临时表中为您提供所需的结果,然后您可以截断 your_table 并插入临时表中的数据。

您还可以使用普通表代替临时表,并在最后交换它们。

关于MYSQL 重复行的复杂更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18186676/

相关文章:

php - 无法在 laravel 中创建表

MySQL 查询预订。如何允许同一日期的两次预订(入住/退房)

mysql - 从数据库中选择三个序列

返回无效结果的 mySQL 搜索函数

c# - Linq 到 SQL : how to handle database changes

java - 删除 ArrayList 中的重复元素并在第一个元素后的括号中添加出现的总数

Mysql2::错误:操作数应包含 1 列:

mysql - SQL - 创建具有时间戳列引用的默认值的列

python - pre-commit 测试应该使用大数据集并在查询时间过长时失败,还是应该使用小型测试数据库?

php - 插入到 mySQL 中会插入重复项吗? - 重复 double 参赛