2013-05-09 77 views
-2

我一直在嘗試使用下面的語句來更新數據庫中的一列的某些行,但它不工作從另一個表

UPDATE member_payment AS p 
SET debtor_receipt = (SELECT Sum(d.amount) 
         FROM debtor_receipt d, 
           customer c, 
           dairy_member m, 
           member_payment p, 
           vendor v 
         WHERE m.member_id = c.member 
           AND d.customer = c.customer_id 
           AND p.payee = v.vendor_id 
           AND v.member = m.member_id 
           AND d.txn_date = '2013-04-30') 
WHERE p.payee IN(SELECT vendor_id 
        FROM vendor v, 
         debtor_receipt d, 
         customer c, 
         dairy_member m, 
         member_payment p 
        WHERE v.member = m.member_id 
         AND m.member_id = c.member 
         AND d.customer = c.customer_id 
         AND d.txn_date = '2013-04-30') 
     AND p.txn_date = '2013-05-08' 
+1

什麼語言?此外,你應該格式化你的代碼。 – MichaelJCox 2013-05-09 15:14:56

+0

@MichaelJCox看起來像Es-queue-el。除非你要求這個平臺。 – Kermit 2013-05-09 15:17:20

+2

知道SQL的這種方言是很有用的;知道「它不工作」的含義會更有用。 – 2013-05-09 15:19:16

回答

0

你的第二子查詢更新與數據的列缺少member_payment P A加盟條件,所以你得到了笛卡爾聯接,這是不可取的。

這是您應該使用現代連接語法的另一個原因,因爲您可以準確瞭解每個表的連接方式。另外,不要在更新語句和子查詢中重用p別名。例如,我已經從第一子選擇添加連接條件p.payee = v.vendor_id修補了第二子查詢:

UPDATE member_payment 
SET debtor_receipt = 
    (SELECT Sum(d.amount) 
    FROM debtor_receipt d 
    JOIN customer c ON c.customer_id = d.customer 
    JOIN dairy_member m ON m.member_id = c.member 
    JOIN vendor v ON v.member = m.member_id 
    JOIN member_payment p ON p.payee = v.vendor_id 
    WHERE d.txn_date = '2013-04-30') 
WHERE payee IN 
    (SELECT v.vendor_id 
    FROM debtor_receipt d 
    JOIN customer c ON c.customer_id = d.customer 
    JOIN dairy_member m ON m.member_id = c.member 
    JOIN vendor v ON v.member = m.member_id 
    JOIN member_payment p ON p.payee = v.vendor_id 
    WHERE d.txn_date = '2013-04-30') 
AND txn_date = '2013-05-08' 

我不知道這是什麼更新語句試圖做的。也許你打算第一個子查詢對第二個子查詢返回的每個member_payment.payee總結debtor_receipt.amount?我們還可以從子查詢中刪除member_payment表,因爲供應商表已經包含必要的vendor_id。喜歡的東西:

UPDATE mp 
SET mp.debtor_receipt = 
    (SELECT Sum(d.amount) 
    FROM debtor_receipt d 
    JOIN customer c ON c.customer_id = d.customer 
    JOIN dairy_member m ON m.member_id = c.member 
    JOIN vendor v ON v.member = m.member_id 
    WHERE d.txn_date = '2013-04-30' 
    AND v.vendor_id = mp.payee) 
FROM member_payment mp 
WHERE mp.payee IN 
    (SELECT v.vendor_id 
    FROM debtor_receipt d 
    JOIN customer c ON c.customer_id = d.customer 
    JOIN dairy_member m ON m.member_id = c.member 
    JOIN vendor v ON v.member = m.member_id 
    WHERE d.txn_date = '2013-04-30') 
AND mp.txn_date = '2013-05-08' 

您應該單獨運行的子查詢,直到他們返回你所期望的數據對他們的工作,然後將它們組裝成你想要做什麼的更新語句。

+0

第二種形式是非標準SQL,可能不適用於所有DBMS。 – 2013-05-09 16:44:59

+0

是的,如果OP告訴我們數據庫,那將會很好。 – criticalfix 2013-05-09 16:48:08

0

我相信你的代碼失敗了,因爲你無法到達圓括號之外的member_payment。


UPDATE member_payment AS p 
SET debtor_receipt = (SELECT Sum(d.amount) 
        FROM debtor_receipt d, 
          customer c, 
          dairy_member m, 
          member_payment p, 
          vendor v 
        WHERE m.member_id = c.member 
          AND d.customer = c.customer_id 
          AND p.payee = v.vendor_id 
          AND v.member = m.member_id 
          AND d.txn_date = '2013-04-30' 
          AND p.payee IN(SELECT vendor_id 
               FROM vendor v, 
                debtor_receipt d, 
                customer c, 
                dairy_member m, 
                member_payment p 
               WHERE v.member = m.member_id 
                AND m.member_id = c.member 
                AND d.customer = c.customer_id 
                AND d.txn_date = '2013-04-30') 
            AND p.txn_date = '2013-05-08'         

          )