2013-03-21 2 views
1

동일한 열을 가진 두 개의 테이블이 있습니다. 이 두 테이블을 함께 결합하고 싶습니다. 첫 번째 테이블의 모든 행과 두 번째 테이블에서 같은 위치의 첫 번째 테이블에 존재하지 않는 날짜가있는 모든 행을 포함하고 있습니다.두 테이블을 새 테이블로 결합하여 다른 테이블의 선택 행을 무시합니다.

예 :

거래 :

date |location_code| product_code | quantity 
------------+------------------+--------------+---------- 
2013-01-20 | ABC   | 123   | -20   
2013-01-23 | ABC   | 123   | -13.158 
2013-02-04 | BCD   | 234   | -4.063 

transactions2 :

date |location_code| product_code | quantity 
------------+------------------+--------------+---------- 
2013-01-20 | BDE   | 123   | -30   
2013-01-23 | DCF   | 123   | -2 
2013-02-05 | UXJ   | 234   | -6 

원하는 결과 :

date |location_code| product_code | quantity 
------------+------------------+--------------+---------- 
2013-01-20 | ABC   | 123   | -20   
2013-01-23 | ABC   | 123   | -13.158 
2013-01-23 | DCF   | 123   | -2 
2013-02-04 | BCD   | 234   | -4.063 
2013-02-05 | UXJ   | 234   | -6 

나는 이것에 대해 어떻게 갈 것인가? 나는 예를 이것에 대한 시도 :

SELECT date, location_code, product_code, type, quantity, location_type, updated_at 
     ,period_start_date, period_end_date 
    INTO transactions_combined 
    FROM (SELECT * FROM transactions_kitchen k 
      UNION ALL 
      SELECT * 
      FROM transactions_admin h 
      WHERE h.date NOT IN (SELECT k.date FROM k) 
     ) AS t; 

하지만 내가 같은 일을 행을 포함하려면 고려해야하지만, 다른 위치하지 않습니다. PostgreSQL 9.2를 사용하고 있습니다.

+0

귀하의 검색어는 귀하의 샘플 데이터와 일치하지 않습니다. 이 깨진 질문을 수리하십시오. 그 동안 샘플에 따라 결과를 표시하여 원하는 것을 명확히하십시오. 또한 psql은 PostgreSQL의 기본 명령 행 터미널입니다. 나는 그 꼬리표를 고쳤다. 이제 사용중인 버전도 알려주십시오. –

+0

예제 데이터로 원하는 결과를 명시하여 질문을 명확히하고 내 PostgreSQL의 버전 번호를 추가했습니다.그리고 네, 쿼리가 망가 졌음을 알고 있습니다. 그냥 시도한 것의 의미를 알려줍니다. – jesseniem

답변

1

당신의 설명에 따르면, 쿼리는 다음과 같이 수 :
나는 같은 위치 및 날짜에 대한 두 번째 테이블에서 행을 제외 LEFT JOIN/IS NULL를 사용합니다. NOT EXISTS은 다른 좋은 옵션입니다.
UNION은 단순히 설명하는 것을 수행하지 않습니다.

CREATE TABLE AS 
SELECT date, location_code, product_code, quantity 
FROM transactions_kitchen k 

UNION ALL 
SELECT h.date, h.location_code, h.product_code, h.quantity 
FROM transactions_admin h 
LEFT JOIN transactions_kitchen k USING (location_code, date) 
WHERE k.location_code IS NULL; 

사용 CREATE TABLE AS 대신 SELECT INTO.
나는 the manual on SELECT INTO을 인용 :

CREATE TABLE ASSELECT INTO 기능적으로 유사하다. CREATE TABLE AS 은 양식이 INTO 절인 을 다르게 해석하기 때문에 ECPG 또는 PL/pgSQL에서 을 사용할 수 없으므로 권장 구문입니다. 또한 CREATE TABLE AS은 에 의해 제공되는 기능의 수퍼 세트를 제공합니다.

또는 목표 테이블이 이미 존재하는 경우 :

INSERT INTO transactions_combined (<list names of target column here!>) 
SELECT ... 

나는 열 이름으로 date을 사용하지 권합니다. 모든 SQL 표준에서 reserved word이고 PostgreSQL에서는 함수 및 데이터 유형 이름입니다.

+0

LEFT JOIN과 IS NULL을 사용하여 트릭을 만들었습니다. – jesseniem

1

UNION을 UNION으로 변경하면 각 테이블에서 고유 한 행만 반환해야합니다.

+0

'UNION'은 * 완전한 중복을 배제하고 분명히 잘못되었습니다. –

관련 문제