テスト結果に基づいてデータを提供するために、4 つのテーブル間でデータを結合するクエリがあります。一意のデータの各行に対して 2 つの同一のレコードを返すという事実を除いて、クエリは正常に機能しています。結合内のテーブルの 1 つの主キー列 (a.id) の前に DISTINCT をスローすると、すべての重複が排除されます。ただし、DISTINCT はパフォーマンスに影響を与える傾向があることを読んだ (そして発見した) ため、可能であれば、よりパフォーマンスの高いソリューションを見つけたいと考えています。うまくいけば、簡単に修正できるJOINSでばかげたことをしているだけです。これは postgresql-9.0.x に関するものです。はい、9.1.x にアップグレードした場合、'group by a.id' を実行できる可能性が高いことは承知していますが、今のところ 9.0.x で立ち往生しています。
クエリは次のとおりです。
SELECT a.id,a.suiteid,a.testname
,date_trunc('second',a.last_update) AS last_update
,regexp_replace(p.relname,E'tests','','g')
,o.osname
FROM smoketests AS a
, pg_class AS p
, smoke AS t
, osversmap AS o
WHERE a.osversion=o.osversion
AND a.suiteid=t.id
AND a.tableoid=p.oid
AND ( a.current_status='FAILED' )
AND ( a.arch='i386' )
AND ( a.os='Darwin' )
AND a.last_update>'2012-05-01 04:00:00'
AND a.last_update<'2012-05-02 14:20:45'
ORDER BY a.id ;
次の出力が生成されます。
id | suiteid | testname | last_update | regexp_replace | osname
----------+---------+------------------+---------------------+----------------+------------
32549818 | 668232 | bug377064 | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
32549818 | 668232 | bug377064 | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
32549819 | 668232 | funcmem_resize | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
32549819 | 668232 | funcmem_resize | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
32549820 | 668232 | leitest | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
32549820 | 668232 | leitest | 2012-05-01 08:38:07 | smoke | OSX-10.7.x
問題は id 列に見られます。ここでは、a.id がスモーク テーブルの一意の主キーであり、実際には重複がありませんが、各値が 2 つ返されます。「煙」テーブルは、smoketests テーブルと 1 対多の関係にありますが、なぜすべての重複を取得しているのか、いまだに混乱しています。