【问题标题】:Combining 2 rows in table合并表中的 2 行
【发布时间】:2023-03-08 12:20:02
【问题描述】:

我有以下数据:

-------table_a-------
| id | data | value |
| 1  |   5  |   1   |
| 2  |   3  |   3   |

我想要的输出是将第 2 行与第 1 行合并,这样在id = 1 的位置,数据保留到=5,但添加了值,所以1+3

-------table_a-------
| id | data | value |
| 1  |   5  |   4   |

这是就我得到的查询而言,但第一个似乎不起作用。这也不是为了检索数据,而是为了操作数据库中的数据。

当前查询(第一个不工作):

UPDATE table_a SET value = value + (SELECT a.value FROM table_a  a WHERE a.id = 2) WHERE id = 1;
DELETE FROM table_a WHERE id = 2;

【问题讨论】:

  • 第2行和第1行合并的规则是什么?该表是否只有两行?目的是 update 还是 select 查询就足够了?
  • @GordonLinoff 该表将有 100,000 行。你说的规则是什么意思? (如果你的意思是我想要发生什么,我希望添加值,但保持一行的 id 和 data 不变)
  • @GordonLinoff 需要更新,因为原始数据需要更改/更新。

标签: mysql sql merge


【解决方案1】:

如果这是你想要的逻辑:

UPDATE table_a
    SET value = value + (SELECT a.value FROM table_a  a WHERE a.id = 2)
    WHERE id = 1;
DELETE FROM table_a WHERE id = 2;

update 不起作用,因为您无法在查询的其余部分引用正在更新的表。您可以使用 hack 进行更新并执行以下操作:

UPDATE table_a
    SET value = value + (SELECT value FROM (SELECT a.value FROM table_a  a WHERE a.id = 2) )
    WHERE id = 1;

双重select 解决了这个问题。更正确的方法是使用join

UPDATE table_a a CROSS JOIN 
       (SELECT a.value FROM table_a  a WHERE a.id = 2) as a2
    SET a.value = a.value + a2.value
    WHERE id = 1;

【讨论】:

  • 谢谢,这就像一个魅力。我不知道无法引用更新表,所以感谢您的解释:)
【解决方案2】:

下面是一种方法,您可以通过将表与自身连接来创建累积列。

我假设 Id 列是一个标识列, 希望这会有所帮助。

CREATE TABLE [dbo].[TestTable](
    [id] [int] NULL,
    [data] [int] NULL,
    [value] [int] NULL
) ON [PRIMARY]

INSERT INTO [dbo].[TestTable]
           ([id]
           ,[data]
           ,[value])
     VALUES
            (1,5,1),
            (2,3,3),
            (3,4,4)


SELECT  a.id , a.data , a.value + b.value as Sum
FROM    [TestTable] a
    left join [TestTable] b
        on a.id + 1 = b.id

【讨论】:

    【解决方案3】:

    这会起作用,请检查。

    UPDATE table_a,
    (SELECT value as val FROM table_a where id = 2) AS t2
    SET table_a.value = table_a.value+t2.val
    where table_a.id = 1;
    
    DELETE from table_a where id = 2;
    

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 2013-06-28
      • 2012-08-04
      • 2013-07-19
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多