2013-05-09 79 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'         

          )