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
子句过滤掉该行。谢谢