【问题标题】:How to get max(column_name) from a table irrespective of a where clause in the query?无论查询中的 where 子句如何,如何从表中获取 max(column_name)?
【发布时间】:2021-03-08 09:27:15
【问题描述】:

我需要将数据插入表中,其中一列是 seq_number。我在选择查询中有一个 where 子句,我想为要插入的每条记录插入 max(seq_num)+1。 seq_num 的最大值是给我 where 子句的最大值,而不是表中的实际最大值。

INSERT INTO TABLE_NAME 
SELECT
    NEWID(),
    MAX(SEQ_ORD_R)+1,  -- This should be the max from table irrespective of the where clause
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP
FROM TABLE_NAME
WHERE SOFA_K = 'FD5B6BE8-F1CF-42C0-9216-B13163413F96'

【问题讨论】:

  • 您可以通过将seq_ord_r 定义为自动增量列来实现这一点,而根本不这样做。
  • 看这里:stackoverflow.com/questions/65001331/…它可以帮助你
  • MySql 没有函数 NEWID 据我所知(这是用户定义的函数吗?),列名 seq_num 根据您的描述还是 SEQ_ORD_R 根据您的 SQL?见Why should I provide a Minimal Reproducible Example for a very simple SQL query?
  • Gordon Linoff -- 感谢您的快速回复,我不知道他们是否会同意此时更改数据类型,但我会问。 Slava Rozhnev -- 谢谢,我正在查看链接 Booboo -- sql server 具有 NEWID() 函数来创建 UUID(唯一标识符)。这里的问题列是我在上面的描述中引用为 seq_num 的 SEQ_ORD_R。
  • MySql有一个函数UUID

标签: mysql sql insert-select


【解决方案1】:
SELECT MAX(SEQ_ORD_R) FROM TABLE_NAME INTO @K;
INSERT INTO TABLE_NAME 
SELECT
    NEWID(),
    (SELECT @K := @K+1),
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP
FROM TABLE_NAME
WHERE SOFA_K = 'FD5B6BE8-F1CF-42C0-9216-B13163413F96'

【讨论】:

  • 插入多行。已经尝试过了,所有行都给出相同的 SEQ_ORD_R
  • 这就是为什么您应该创建一个最小可重现示例。也就是说,访问 db-fiddle.com 之类的站点并创建包含足够数据的示例表,这些数据可以证明问题,并且该站点上的人们可以测试他们假设的解决方案。它为每个人(嗯,不是你,而是我们)节省了很多时间。
  • 谢谢.. 但我能够解决这个问题。这是我的第一篇文章,所以不知道 db-fiddle.com。我会记住这一点。我会尽快发布答案
【解决方案2】:
INSERT INTO TABLE_NAME 
SELECT
    NEWID(),
    max_seq_r+row_number() over (partition by 1 order by max_seq_r),  -- This should be the max from table irrespective of the where clause
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP
FROM TABLE_NAME A inner join 
(select max(SEQ_ORD_R) as max_seq_r from TABLE_NAME) B on 1=1
WHERE SOFA_K = 'xyz'

【讨论】:

  • 仅供参考:此解决方案需要 MySql 8+(我的回答没有做出这样的假设。)并且与我的回答一样,您需要使用函数 UUID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2023-03-07
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多