【问题标题】:How to add the result of a query into a column如何将查询结果添加到列中
【发布时间】:2018-06-10 08:04:52
【问题描述】:

我有以下查询,它返回一列值:

SELECT CONCAT(
  from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
  CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 
  AS SIGNED)
) FROM IEX_Tick;

如何将此列复制到同一个表中的现有列?

【问题讨论】:

    标签: java mysql unix


    【解决方案1】:

    我相信子查询会做:

    UPDATE IEX_Tick SET SomeColumn = (
       SELECT CONCAT(
           from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
           CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 AS SIGNED)
       ) FROM IEX_Tick;
    )
    

    编辑:
    (回复this comment

    在做了一些研究后,我发现,尽管上面建议的解决方案是有效的SQL,但它不是更新MySQL 中的表的受支持的方式。

    我从 Stack Overflow 上的各种相关帖子(例如 thisthis)收集的信息表明 MySQL 限制了这些类型的 UPDATE 查询:

    ...因为您的更新可能是周期性的...如果更新该记录会导致发生导致 WHERE 条件为 FALSE 的事情怎么办?您知道情况并非如此,但引擎并非如此。操作中也可能在桌子上存在相反的锁。

    因此,有助于避免MySQL 设置的这种任意限制的可行替代方法是使用另一个子查询,这次是在您的FROM 子句中,如下所示:

    UPDATE IEX_Tick SET SomeColumn = (
       SELECT CONCAT(
           from_unixtime(lastSaleTime/1000, '%Y-%d-%m %h:%i:%s.'),
           CAST(EXTRACT(MICROSECOND FROM from_unixtime(lastSaleTime/1000))/1000 AS SIGNED)
       ) FROM (
           SELECT * FROM IEX_Tick AS SomeName
       );
    )
    

    注意:我个人会避免使用SELECT * FROM IEX_Tick,特别是如果IEX_Tick 有很多列。我优化子查询的好方法是只使用所需的列。

    【讨论】:

    • 我试过了,但得到了错误“您不能在 From 子句中指定目标表 'IEX_Tick' 进行更新。我一直在搜索,这似乎是 mysql 的事情
    • 你是对的@ajasif。查看我的编辑。我做了一些研究,找到了一个适合你的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多