【问题标题】:Syntax for UPDATE with LEFT JOIN带有 LEFT JOIN 的 UPDATE 语法
【发布时间】:2014-05-26 01:28:39
【问题描述】:

如何通过更新插入此查询?我已经尝试了所有可能的组合,但似乎没有任何效果!

UPDATE Test_table2
SET Pledge_Status = closed
WHERE (
    SELECT SUM(pledgers.Pledge_payment_amt) AS pledged
    FROM Test_table2  AS recipients
    LEFT JOIN Test_table2 AS pledgers
    ON recipients.GIFT_NO = pledgers.PLEDGE_GIFT_NO
    GROUP BY recipients.GIFT_NO
    HAVING recipients.Pledge_Amt >= pledged
    ORDER BY recipients.CRSID ASC
);

架构(所有 varchar):

ID、姓名、Pledge_Amount、Pledge_payment_amt、Gift_No、Pledge_Gift_No、Pledge_Open/Closed

非常感谢!

【问题讨论】:

  • 请尝试至少提供表模式,这样可以更容易理解您的问题。如果您想更进一步,请花时间在sqlfiddle.com 上创建一个示例。
  • sqlfiddle 很棒。谢谢sqlfiddle.com/#!2/aecf2

标签: mysql join sql-update


【解决方案1】:

平行于this question 我建议你使用WHERE ... IN SELECT。此外,您需要将子查询中每一行的 ID 传递给主查询,并且由于您没有提供表架构,我们只能在这里猜测:

UPDATE Test_table2
SET Pledge_Status = closed
WHERE [your id column] IN (
    SELECT [your id column]
    FROM Test_table2  AS recipients
    LEFT JOIN Test_table2 AS pledgers
    ON recipients.GIFT_NO = pledgers.PLEDGE_GIFT_NO
    GROUP BY recipients.GIFT_NO
    HAVING recipients.Pledge_Amt >= SUM(pledgers.Pledge_payment_amt)
    /*ORDER BY recipients.CRSID ASC <-- no need to order anything here */
);

【讨论】:

  • 谢谢。我决定改变我的查询并写了这个: UPDATE Test_table2 set Pledge_Status = closed where Test_table2.GIFT_NO in ( select GIFT_NO FROM ( SELECT recipients.*,SUM(pledgers.Pledge_payment_amt) AS 承诺 FROM Test_table2 AS 收件人 LEFT JOIN Test_table2 AS接受者上的承诺者.GIFT_NO = 承诺者.PLEDGE_GIFT_NO GROUP BY 接受者.GIFT_NO HAVING 接受者.Pledge_Amt >= 已承诺 ) );为什么这是错误的?
  • select GIFT_NO FROM (SELECT... - 您不能用子 SELECT 代替表名。此外,您从数据库中获得的错误消息应该可以解释您的大部分问题。
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 2013-12-26
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多