【问题标题】:SQL UPDATE TABLE from SELECT query from other tables来自其他表的 SELECT 查询的 SQL UPDATE TABLE
【发布时间】:2023-01-12 16:48:20
【问题描述】:

我有 bd hf3 和 5 个表: active_preset 列 (id , preset_id) preset 带列(id、birja_id、trend_id、分形、interval_up) birja 带列(id,名称) trend 带列(id,名称) uq_active_preset 带列(id、birja、trend、fractal、interval_up)

preset表中我有几条记录。其中一些通过外键 preset_id 在表 active_preset 中。 active_preset表中有几条记录只存在一次,多于一次。

我需要用表 active_preset 中的记录更新表 uq_active_preset,忽略重复的记录(如果存在)。

我确实从active_preset查询过,效果很好:

SELECT 
    b.name AS birja, p.fractal AS fractal , tre.name AS trend, p.interval_up AS interval_up  
FROM hf3.active_preset AS ap
INNER JOIN hf3.preset AS p on p.id = ap.preset_id
INNER JOIN hf3.birja AS b on b.id = p.birja_id
INNER JOIN hf3.trend AS tre on tre.id = p.trend_id
GROUP BY b.name, p.fractal, tre.name, p.interval_up
HAVING COUNT(*) >= 1

但是不知道怎么更新uq_active_preset

我试过了,它返回语法错误:1064:

UPDATE hf3.uq_active_preset uap SET 
  uap.birja = st.birja ,
  uap.fractal = st.fractal,
  uap.trend = st.trend,
  uap.interval_up = st.interval_up,
 FROM (SELECT b.name AS birja, p.fractal AS fractal , tre.name AS trend, p.interval_up AS interval_up  
        from hf3.active_preset AS ap
        INNER JOIN hf3.preset AS p on p.id = ap.preset_id
        INNER JOIN hf3.birja AS b on b.id = p.birja_id
        INNER JOIN hf3.trend AS tre on tre.id = p.trend_id
        GROUP BY b.name, p.fractal, tre.name, p.interval_up
        HAVING COUNT(*) >= 1
        ) st

【问题讨论】:

  • MySQL <> SQL 服务器(MS SQL)。删除不匹配的标签。
  • 错误 1064 声称您使用的是 MySQL。如果是这样,那么研究UPDATE Statement - >“多表语法”。

标签: mysql sql sql-server sql-update


【解决方案1】:

当您使用 from 进行更新时,就像您将更新的表与查询结果结合起来一样。因此,您还需要一个 where 语句来判断这两者的连接位置。另外,不要在 set 语句中使用更新表的别名。 你需要这样的东西:

UPDATE hf3.uq_active_preset uap SET birja=st.birja,fractal=st.fractal,trend=st.trend,interval_up=st.interval_up
 FROM (SELECT b.name AS birja, p.fractal AS fractal , tre.name AS trend, p.interval_up AS interval_up  
        from hf3.active_preset AS ap
        INNER JOIN hf3.preset AS p on p.id = ap.preset_id
        INNER JOIN hf3.birja AS b on b.id = p.birja_id
        INNER JOIN hf3.trend AS tre on tre.id = p.trend_id
        GROUP BY b.name, p.fractal, tre.name, p.interval_up
        HAVING COUNT(*) >= 1
        ) st
where uap.fkey=st.fkey

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多