2012-03-18 1 views
0

Windows 7 x64에서 Postgres 9.1.3 32 비트를 실행 중입니다. (64 개 비트 포스트 그레스와 호환에는 윈도우 PostGIS와 자료가 없기 때문에 32 비트를 사용한다.) (편집 :. PostGIS와 2.0로,이 창에 포스트 그레스 64 비트와 호환)Postgres LEFT JOIN이 왼쪽 테이블보다 많은 행을 생성 중입니다.

을 나는 쿼리가 그 왼쪽은 임시 테이블로 테이블 (consistent.master)을 조인 한 다음 결과 데이터를 세 번째 테이블 (consistent.masternew)에 삽입합니다.

이 값은 left join이므로 결과 테이블의 쿼리에서 왼쪽 테이블과 같은 수의 행이 있어야합니다. 그러나 이것을 실행하면

SELECT count(*) 
FROM consistent.master 

나는 2085343이됩니다. 하지만 이것을 실행하면 :

SELECT count(*) 
FROM consistent.masternew 

나는 2085703이됩니다.

masternew의 행 수가 master 이상일 수있는 방법은 무엇입니까? masternewmaster과 같은 행 수를 가져야하지, 쿼리의 왼쪽 테이블?

다음은 쿼리입니다. mastermasternew 테이블은 동일하게 구조화되어야합니다.

--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를 통해 수행했습니다.

답변

7

왼쪽 조인의 테이블 수가 왼쪽 테이블의 행 수와 같을 필요는 없습니다. 기본적으로 정상 조인과 비슷하지만, 정상 조인에는 나타나지 않는 왼쪽 테이블의 행이 추가됩니다. 따라서 왼쪽 표의 한 행과 일치하는 오른쪽 표의 행이 두 개 이상있는 경우 왼쪽 표의 행 수보다 결과 행 수가 많을 수 있습니다.

당신이하고 싶은 일을하기 위해서, by by와 count를 사용하여 여러개를 찾아야합니다.

select citation_id 
from stops join master on stops.citation_id = master.citation_id 
group by citation_id 
having count(*) > 1 
+0

고맙습니다. 그것이 바로 그 것이다. LEFT JOIN은 조인의 * 최소 * 수가 왼쪽 표의 행 수를 의미합니다. –

관련 문제