MySQL,如何在SELECT查询中引用子查询字段

时间:2016-08-17 03:23:04

标签: mysql correlated-subquery

我正在尝试使用以下查询计算MySQL中的帐户余额

SELECT accountNumber,
(
    SELECT  amount
    FROM    accountDebits
    WHERE   accountNumber = accounts.accountNumber
) debits,
(
    SELECT  amount
    FROM    accountCredits 
    WHERE   accountNumber = accounts.accountNumber
) credits,
credits - debits as balance
FROM    accounts

但是我收到了这个错误:

  

错误代码:1054。未知列'信用'在'字段列表'

如何在select?

中引用子查询别名

3 个答案:

答案 0 :(得分:0)

用另一个执行计算的子查询包装它:

SELECT accountNumber, debits, credits, credits - debits as balance
FROM (
  SELECT accountNumber,
  (
    SELECT  amount
    FROM    accountDebits
    WHERE   accountNumber = accounts.accountNumber
  ) debits,
  (
    SELECT  amount
    FROM    accountCredits 
    WHERE   accountNumber = accounts.accountNumber
  ) credits
  FROM accounts
  ) x

虽然这会启动并运行您的查询,但您最好使用外部联接:

SELECT accountNumber, debits, credits, credits - debits as balance
FROM (
  SELECT
      a.accountNumber,
      coalesce(sum(d.amount), 0) debits,
      coalesce(sum(c.amount), 0) credits,
  FROM accounts a
  LEFT JOIN accountDebits d
    ON d.accountNumber = a.accountNumber
  LEFT JOIN accountCredits c
    ON c.accountNumber = a.accountNumber
) x

答案 1 :(得分:0)

使用table.field约定,应该可以工作

SELECT accountNumber,
(
    SELECT  amount
    FROM    accountDebits
    WHERE   accountNumber = accounts.accountNumber
) debits,
(
    SELECT  amount
    FROM    accountCredits 
    WHERE   accountNumber = accounts.accountNumber
) credits,
credits.amount - debits.amount as balance
FROM    accounts

答案 2 :(得分:0)

我想你想这样做:

SELECT a.*,
       (COALESCE(credits, 0) - COALESCE(debits, 0)) as balance
FROM (SELECT accountNumber,
             (SELECT SUM(ad.amount)
              FROM accountDebits ad
              WHERE ad.accountNumber = a.accountNumber
             ) as debits,
             (SELECT SUM(ac.amount)
              FROM accountCredits ac 
              WHERE ac.accountNumber = a.accountNumber
             ) credits
      FROM accounts a
     ) a;

您需要子查询,因为您无法在定义它们的同一SELECT中引用派生列。您需要聚合函数将所有借方/贷方合并为每个帐户的单个值。