4

Windows 7 x64 で Postgres 9.1.3 32 ビットを実行しています。(64 ビット Postgres と互換性のある Windows PostGIS リリースがないため、32 ビットを使用する必要があります。) (編集: PostGIS 2.0 の時点で、Windows 上の Postgres 64 ビットと互換性があります。)

テーブル ( ) を一時テーブルと結合し、結果のデータを 3 番目のテーブル ( ) に挿入するクエリがありますconsistent.masterconsistent.masternew

これは であるためleft join、結果のテーブルには、クエリの左側のテーブルと同じ数の行が含まれている必要があります。ただし、これを実行すると:

SELECT count(*)
FROM consistent.master

私は得る2085343。しかし、これを実行すると:

SELECT count(*)
FROM consistent.masternew

私は得る2085703

masternewよりも多くの行を持つにはどうすればよいmasterですか? クエリの左側のテーブルであるmasternewと同じ数の行を持つべきではありませんか?master

以下はクエリです。masterとテーブルはmasternew同じ構造である必要があります。

--temporary table created here
--I am trying to locate where multiple tickets were written on
--a single traffic stop
WITH stops AS (
    SELECT citation_id,
           rank() OVER (ORDER BY offense_timestamp,
                     defendant_dl,
                     offense_street_number,
                     offense_street_name) AS stop
    FROM   consistent.master
    WHERE  citing_jurisdiction=1
)

--Here's the insert statement. Below you'll see it's
--pulling data from a select query
INSERT INTO consistent.masternew (arrest_id,
  citation_id,
  defendant_dl,
  defendant_dl_state,
  defendant_zip,
  defendant_race,
  defendant_sex,
  defendant_dob,
  vehicle_licenseplate,
  vehicle_licenseplate_state,
  vehicle_registration_expiration_date,
  vehicle_year,
  vehicle_make,
  vehicle_model,
  vehicle_color,
  offense_timestamp,
  offense_street_number,
  offense_street_name,
  offense_crossstreet_number,
  offense_crossstreet_name,
  offense_county,
  officer_id,
  offense_code,
  speed_alleged,
  speed_limit,
  work_zone,
  school_zone,
  offense_location,
  source,
  citing_jurisdiction,
  the_geom)

--Here's the select query that the insert statement is using.    
SELECT stops.stop,
  master.citation_id,
  defendant_dl,
  defendant_dl_state,
  defendant_zip,
  defendant_race,
  defendant_sex,
  defendant_dob,
  vehicle_licenseplate,
  vehicle_licenseplate_state,
  vehicle_registration_expiration_date,
  vehicle_year,
  vehicle_make,
  vehicle_model,
  vehicle_color,
  offense_timestamp,
  offense_street_number,
  offense_street_name,
  offense_crossstreet_number,
  offense_crossstreet_name,
  offense_county,
  officer_id,
  offense_code,
  speed_alleged,
  speed_limit,
  work_zone,
  school_zone,
  offense_location,
  source,
  citing_jurisdiction,
  the_geom
FROM consistent.master LEFT JOIN stops
ON stops.citation_id = master.citation_id

問題が発生した場合に備えて、VACUUM FULL ANALYZE両方のテーブルを実行してインデックスを再作成しました。(正確なコマンドは不明です。pgAdmin III で行いました。)

4

2 に答える 2

11

左結合の行数は、必ずしも左テーブルの行数と同じではありません。基本的には通常の結合と同じですが、通常の結合では表示されない左側のテーブルの行も追加されます。したがって、左側のテーブルの 1 つの行と一致する右側のテーブルに複数の行がある場合、左側のテーブルの行数よりも多くの行が結果に含まれる可能性があります。

やりたいことを実行するには、group by と count を使用して倍数を検出する必要があります。

select citation_id
from stops join master on stops.citation_id = master.citation_id
group by citation_id
having count(*) > 1
于 2012-03-18T20:29:08.843 に答える