【问题标题】:Converting select statement to update (including exists & having)将选择语句转换为更新(包括存在和拥有)
【发布时间】:2019-04-07 15:24:47
【问题描述】:

我正在尝试更改数据库中的一些记录,但遗憾的是我的 sql 知识有点有限。在网上搜索和阅读内容后,我设法编写了一个选择语句,在其中我可以找到我想要更新的记录,但我不明白编写更新语句的逻辑来做到这一点。我必须做几个类似的更新声明,所以我希望这个我能自己弄清楚其余的

这是我的选择语句:

SELECT 
    MG.id,
    MG.status,
    MG.fin,
    MG.execDateTime,
    EXISTS
    ( 
    SELECT 1
        FROM Mtask T
                JOIN MTaskHis TH ON TH.t_id= T.id
        WHERE T.tg_id = MG.id
                AND YEAR(TH.dateTime) = 2019 
    ) AS hasExecStart,

    NMG.id,
    NMG.execDateTime,
    EXISTS
    ( 
    SELECT 1
        FROM Mtask T
                JOIN MTaskHis TH ON TH.t_id = T.id
        WHERE T.tg_id = NMG.id
                AND YEAR(TH.dateTime) = 2019
    ) AS hasExecNext

FROM Management_Group MG
        JOIN MT_Groupman MTGM ON 
        MG.tgm_id = MTGM.id

        LEFT JOIN Management_Group NMG ON MTGM.id = 
        NMG.tgm_id AND YEAR(NMG.execDateTime) = 2019

        JOIN Management_Man MM ON MTGM.man_id = MM.id

        JOIN Location L ON MM.location_id = L.id

WHERE L.org_id = 69
        AND MG.stat != 'DELETED'
        AND YEAR(MG.execDateTime) = 2018
        AND MM.Type= 9
        AND MG.fin != 1
        AND EXISTS
        ( 
           SELECT 1
           FROM Mtask T
           WHERE T.tg_id = MG.id
               AND T.stat = 'execution'
    )

HAVING hasExecNext = 0 AND hasExecStart = 1 

我知道 sql 中的标准更新:

UPDATE <TABLENAME>
SET <fieldName> = <value>
WHERE <conditons>

除非我不知道如何将我所做的这个选择语句转换为更新语句,原因是: - 我在哪里将存在的别名放在更新语句中 - 我也不明白何时何地将所有 JOINS 放在 from 语句中 - HAVING呢

像这样进行联合更新​​的最佳方法是什么?

【问题讨论】:

  • 为什么是HAVING 子句?你似乎不想分组。
  • 我这样做是为了查看一个小组是否在当年完成了任务。
  • 我不知道,但我怀疑你想把它推到 WHERE 子句中(在那里重复子查询,你不能在那里使用别名)。

标签: mysql sql select sql-update


【解决方案1】:

在 UPDATE 中,您可以将要更新的表加入到包含当前查询的子查询中。

UPDATE YourTable t
JOIN
(
   << add your query here >>
) q ON q.SomeKeyField = t.SomeKeyField 
SET t.FieldName = q.FieldNameFromSubquery,
    t.OtherFieldName = q.OtherFieldNameFromSubquery

【讨论】:

  • 我在想我不能只做`UPDATE table AS T SET T.fieldname = 'value' WHERE T.id IN(把我的整个select语句放在这里)`
  • @DatExchanges 当然,这也有效。如果要将其设置为 1 个硬编码字符串,并且 id 是该选择中的唯一列。我有点假设您想使用来自查询的值更新某些字段,例如 f.e.状态。
  • 嗯好吧,所以它不会工作,因为我还返回除 id 列之外的其他列。除了在那个特定的 select 语句中存在之外,我不知道该怎么做。
  • 好吧,使用 IN 或 EXISTS 您还可以从正在更新的表的列中进行更新。但无论如何都要尝试 JOIN。
  • 我不太明白你的意思是我可以把我的整个查询放在 > 部分。
猜你喜欢
  • 2020-04-03
  • 2018-01-22
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多