2011-07-04 11 views
1

私はこのようになりますテーブルを持っている:なぜこの左外部結合クエリが正しく機能しないのですか?

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 

aggregated_accounts_by_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-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を実行しています。

編集:これについてもう少し考えた後、私は数ヶ月だけでなく、アカウントに対しても外部結合を残す必要があります。このクエリは、私が欲しいものを正確に行います。それはaccount欄に記入していなかったことを除いて

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の答えは、ほとんど右ました。もちろん、このクエリはかなり高価ですが、そこにあるそのクロスプロダクトとは何でしょうか。しかし、これは大丈夫です。なぜなら、aggregated_accounts_by_monthは4年以上の間、2000行を少し下回っているからです。

答えて

3

2つのこと:

    ON句に LEFT JOIN
  • 動きにWHEREから条件を二つのテーブルの順序を逆

。あなたのaggregated_accounts_by_month

select 
    months.xtn_month, 
    a.account, 
    a.amount 
from 
    months 
    left outer join aggregated_accounts_by_month a 
     on months.xtn_month = a.xtn_month 
     and a.account = 'Expenses:Fuel' 
order by 
    xtn_month; 
+0

これは完全に機能し、実際に私のクエリが機能しなかった理由を実際に説明します。 'account'カラムは月テーブルにないのでnullになり、' where'節はその行をフィルタリングします。ありがとう! –

0

には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; 

また、他の2つの答えが示唆するように参加左、すなわちmonths、その後、aggregated_accounts_by_month

関連する問題