Sql 为什么';左外部联接查询是否正常工作?

Sql 为什么';左外部联接查询是否正常工作?,sql,postgresql,left-join,Sql,Postgresql,Left Join,我有一张这样的桌子: peter=> \d aggregated_accounts_by_month Table "public.aggregated_accounts_by_month" Column | Type | Modifiers -----------+---------+----------- xtn_month | date | account | text | commodity | text | amount |

我有一张这样的桌子:

peter=> \d aggregated_accounts_by_month
Table "public.aggregated_accounts_by_month"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 xtn_month | date    | 
 account   | text    | 
 commodity | text    | 
 amount    | numeric | 
Indexes:
    "idx_aggregated_accounts_by_month_account" btree (account)
    "idx_aggregated_accounts_by_month_month" btree (xtn_month)
peter=> \d months
   Table "pg_temp_2.months"
  Column   | Type | Modifiers 
-----------+------+-----------
 xtn_month | date | 
另一张表如下所示:

peter=> \d aggregated_accounts_by_month
Table "public.aggregated_accounts_by_month"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 xtn_month | date    | 
 account   | text    | 
 commodity | text    | 
 amount    | numeric | 
Indexes:
    "idx_aggregated_accounts_by_month_account" btree (account)
    "idx_aggregated_accounts_by_month_month" btree (xtn_month)
peter=> \d months
   Table "pg_temp_2.months"
  Column   | Type | Modifiers 
-----------+------+-----------
 xtn_month | date | 
months
包含以下内容:

 xtn_month   
------------
 2011-01-01 
 2011-02-01 
 2011-03-01 
 2011-04-01 
 2011-05-01 
 2011-06-01 
 2011-07-01 
按月汇总的账户包含以下相关数据:

 xtn_month  |    account    | amount 
------------+---------------+--------
 2011-01-01 | Expenses:Fuel | 111.31
 2011-02-01 | Expenses:Fuel |  89.29
 2011-03-01 | Expenses:Fuel |  97.41
 2011-04-01 | Expenses:Fuel | 101.70
 2011-05-01 | Expenses:Fuel |   52.9
 2011-07-01 | Expenses:Fuel |  49.55
我尝试运行的查询是:

select 
    months.xtn_month,
    account,
    amount
from
    aggregated_accounts_by_month a
    left outer join months on months.xtn_month = a.xtn_month
where
    account = 'Expenses:Fuel'
order by
    xtn_month;
我希望此查询能够提供以下结果:

 xtn_month  |    account    | amount 
------------+---------------+--------
 2011-01-01 | Expenses:Fuel | 111.31
 2011-02-01 | Expenses:Fuel |  89.29
 2011-03-01 | Expenses:Fuel |  97.41
 2011-04-01 | Expenses:Fuel | 101.70
 2011-05-01 | Expenses:Fuel |   52.9
 2011-06-01 | Expenses:Fuel |
 2011-07-01 | Expenses:Fuel |  49.55
但它实际上给了我这个:

 xtn_month  |    account    | amount 
------------+---------------+--------
 2011-01-01 | Expenses:Fuel | 111.31
 2011-02-01 | Expenses:Fuel |  89.29
 2011-03-01 | Expenses:Fuel |  97.41
 2011-04-01 | Expenses:Fuel | 101.70
 2011-05-01 | Expenses:Fuel |   52.9
 2011-07-01 | Expenses:Fuel |  49.55
我显然做错了什么。有什么想法吗?我正在Mac OS X 10.6.7上运行PostgreSQL 9.0.4

编辑:在进一步考虑这个问题之后,我不仅需要针对几个月,而且还需要针对帐户进行外部连接。此查询完全符合我的要求:

select
    xtn_month,
    account,
    coalesce(amount, 0)
from
    (
        select
            xtn_month,
            account
        from
        (
            select
                distinct xtn_month
            from
                aggregated_accounts_by_month
        ) x
        cross join
        (
            select
                distinct account
            from
                aggregated_accounts_by_month
        ) y
    ) z
    left outer join aggregated_accounts_by_month
        using (xtn_month, account)
where
    account = 'Expenses:Fuel'
order by
    xtn_month;
ypercube的回答几乎是正确的,只是它没有填入
账户
列。这个查询当然是相当昂贵的,因为其中有交叉积。不过,这没关系,因为四年多的数据中,
按月汇总的账户数略低于2000行。

两件事:

  • 颠倒
    左联接中两个表的顺序
  • 将条件从
    WHERE
    移至
    ON
    子句


您的
按月汇总的\u账户
不包含
2011-06-01
。实际上,您可能正在寻找完全联接:

select 
    months.xtn_month,
    account,
    amount
from
    aggregated_accounts_by_month a
    full join months on months.xtn_month = a.xtn_month
where
    account = 'Expenses:Fuel'
order by
    xtn_month;

或者,如其他两个答案所示,左键连接,即
,然后
按月汇总账户

,这完全有效,并解释了我的查询不起作用的原因。
account
列结束为空,因为它不在月份表中,因此
where
子句过滤掉该行。谢谢