簡體   English   中英

SQL - 使用來自同一表的不同子集中的行的值更新表子集中的值

[英]SQL - Updating values in subset of table using values from rows in different subset of same table

實際上,我想使用來自同一表的備用子集中的值來更新 SQL 表子集中的值。 以下面的數據框表示為例:

   Company Employee        Type  Value
0        X        A  Category A     10
1        X        A  Category B      5
2        X        A  Category C      4
3        X        A  Category D      0
4        X        A  Category E      0
5        X        A  Category F      0
6        X        A  Category G      9
7        X        B  Category A     15
8        X        B  Category B      8
9        X        B  Category C      6
10       X        B  Category D      0
11       X        B  Category E      0
12       X        B  Category F      0
13       X        B  Category G      7

對於員工 A 和員工 B,我想更新類型在集合中的值(類別 D、類別 E、類別 F)與值中的相應值,其中類型在集合中(類別 A、類別 B、類別C)。 因此,我想要的結果如下:

   Company Employee        Type  Value
0        X        A  Category A     10
1        X        A  Category B      5
2        X        A  Category C      4
3        X        A  Category D     10
4        X        A  Category E      5
5        X        A  Category F      4
6        X        A  Category G      9
7        X        B  Category A     15
8        X        B  Category B      8
9        X        B  Category C      6
10       X        B  Category D     15
11       X        B  Category E      8
12       X        B  Category F      6
13       X        B  Category G      7

在 MySQL 中執行此操作的最有效方法是什么? 我的嘗試如下:

UPDATE new_table 
SET 
    Value = (SELECT 
            Value
        FROM
            (SELECT 
                *
            FROM
                new_table) t
        WHERE
            Type IN ('Category A', 'Category B', 'Category C'))
WHERE
    Type IN ('Category D', 'Category E', 'Category F');

*我的真實列名與上述不同,因為我認為這些是保留名稱

更新

根據 OP 注釋,需要有一個Type轉換表來指示給定類別的新值應來自何處:

UPDATE new_table t1
JOIN (SELECT 'C1' AS Cat1, 'C4' AS Cat2
      UNION ALL
      SELECT 'C2' AS Cat1, 'C5' AS Cat2
      UNION ALL
      SELECT 'C3' AS Cat1, 'C6' AS Cat2
      ) cats ON cats.Cat2 = t1.Type
JOIN new_table t2 ON t2.Employee = t1.Employee AND t2.Type = cats.Cat1
SET t1.Value= t2.Value

SQLFiddle 上的演示

原答案

由於您在Type值之間有直接關系,因此您可以在更新查詢中利用這一點,方法是將new_table JOIN到自身,其中Type的差異為 3 並從JOIN ed 表更新Value

UPDATE new_table t1
JOIN new_table t2 ON t2.Employee = t1.Employee AND t2.Type = t1.Type - 3
SET t1.Value= t2.Value
WHERE t1.Type in (4, 5, 6);

SQLFiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM