2011-09-19 56 views
1

我需要將表格兌換轉換爲包含從blah填充的日期,但它現在不存在。高級SQL更新問題

我需要選擇兌換表中的所有行,其中pay autokey與redeem.pay相匹配。 blah.number包含在薪資表中,而且我想要獲得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子句中的更新

如何在一條SQL語句中在MySQL中執行此操作?

+0

讓我得到這個直您嘗試更新不存在的表?如果這樣做是不可能的。 – Jrod

+0

不,我正在嘗試使用已存在的等值表中的信息創建一個不存在的字段。 – Chris

+0

這個問題可能會給你一個暗示,試試看: http://stackoverflow.com/questions/839938/mysql-sql-update-with-correlated-subquery-from-the-updated-table-it – HLGEM

回答

2
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 
+0

丁丁我們有一個贏家!謝謝ypercube,我把它與你的第二個解決方案一起工作。 – Chris

1

試試這個:

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 
+0

MySQL根本不喜歡這個。運行查詢時出現此錯誤:#1064 - SQL語法錯誤;請檢查與您的MySQL服務器版本對應的手冊,以便在第3行的'FROM blah INNER JOIN pay pay.number = blah.number INNER JOI'附近使用正確的語法。 – Chris

0

如果在另一個子查詢包裹它(因爲做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)) 
+0

只需創建一個不同的錯誤。 – Chris

+0

什麼是錯誤? –

+0

其SQL語法錯誤。 – Chris

0

您應該使用別名贖回表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) 
+0

沒有,仍然像以前一樣得到相同的錯誤。 – Chris