1

同じ列を持つ2つのテーブルがあります。これらの2つのテーブルを、最初のテーブルのすべての行を含む3番目のテーブルに結合し、2番目のテーブルから同じ場所の最初のテーブルに存在しない日付を持つすべての行を結合したいと思います。

例:

トランザクション:

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

トランザクション2:

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;

ただし、日付は同じで場所が異なる行を含めたいということは考慮されていません。Postgresql9.2を使用しています。

4

2 に答える 2

1

UNION ALLをUNIONだけに変更すると、各テーブルから一意の行のみが返されます。

于 2013-03-21T22:06:25.543 に答える
1

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;

LEFT JOIN/IS NULL同じ場所と日付の2番目のテーブルから行を除外します。見る:

CREATE TABLE ASの代わりに使用してくださいSELECT INTOマニュアル:

CREATE TABLE AS機能的にはに似ていSELECT INTOます。 この形式はECPGまたはPL/pgSQLでは使用できない CREATE TABLE ASため、推奨される構文です。これは、句の解釈が異なるためです。さらに、によって提供される機能のスーパーセットを提供します。SELECT INTOINTOCREATE TABLE ASSELECT INTO

または、ターゲットテーブルがすでに存在する場合:

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

余談ですがdate、列名としては使用しません。これは、すべてのSQL標準では予約語であり、Postgresでは関数とデータ型の名前です。

于 2013-03-21T23:23:45.907 に答える