【问题标题】:Advanced SQL UPDATE question高级 SQL UPDATE 问题
【发布时间】:2011-09-19 18:36:32
【问题描述】:

我需要将表格兑换转换为包含将从 blah 填充的日期,但它目前不存在。

我需要选择兑换表中支付自动密钥与兑换.pay 匹配的所有行。 blah.number 包含在支付表中,在 blah 中我想获得 blah.date。然后我需要将其设置为redeem.date,并确保redeem.days_redeemed不等于0。

UPDATE redeem
SET redeem.date =(SELECT blah.date
FROM blah
INNER JOIN pay ON pay.number = blah.number
INNER JOIN redeem ON redeem.pay = pay.autokey
WHERE redeem.days_redeemed <>0)

这是我收到的错误:您不能在 FROM 子句中指定目标表 'redeem' 进行更新

如何在 MySQL 中用一条 SQL 语句执行此操作?

【问题讨论】:

  • 让我直截了当地说,您正在尝试更新一个不存在的表?如果是这样,那是不可能的。
  • 不,我正在尝试使用已存在的 blah 表中的信息创建一个尚不存在的字段。
  • 这个问题可能会提示您尝试什么:stackoverflow.com/questions/839938/…

标签: mysql sql


【解决方案1】:
UPDATE
    redeem
  JOIN
    pay 
      ON pay.autokey = redeem.pay 
  JOIN
    blah
      ON blah.number = pay.number 
SET 
    redeem.date = blah.date
WHERE
    redeem.days_redeemed <> 0

这应该也可以:

UPDATE
    redeem
SET 
    date = 
      ( SELECT blah.date
        FROM 
            blah
          JOIN
            pay 
              ON blah.number = pay.number 
        WHERE 
            pay.autokey = redeem.pay 
      )
WHERE
    days_redeemed <> 0

【讨论】:

  • 叮叮我们赢了!谢谢 ypercube,我让它与您的第二个解决方案一起使用。
【解决方案2】:

试试这个:

UPDATE redeem SET redeem.date = blah.date
FROM blah
INNER JOIN pay ON pay.number = blah.number
INNER JOIN redeem ON redeem.pay = pay.autokey
WHERE redeem.days_redeemed <>0

【讨论】:

  • MySQL 根本不喜欢这个。运行查询时出现此错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“FROM blah INNER JOIN pay ON pay.number = blah.number INNER JOI”附近使用正确的语法
【解决方案3】:

如果你将它包装在另一个子查询中(因为 MySQL 发出子查询的方式)它应该可以工作:

UPDATE redeem
SET redeem.date =(SELECT date from ( select * from
FROM blah
INNER JOIN pay ON pay.number = blah.number
INNER JOIN redeem ON redeem.pay = pay.autokey
WHERE redeem.days_redeemed <>0))

【讨论】:

    【解决方案4】:

    您应该在 FROM 子句中为兑换表使用别名:

        UPDATE redeem
        SET redeem.date =(SELECT blah.date
        FROM blah
        INNER JOIN pay ON pay.number = blah.number
        INNER JOIN redeem r ON r.pay = pay.autokey
        WHERE r.days_redeemed <>0)
    

    【讨论】:

      猜你喜欢
      • 2022-09-25
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多