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

交易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;

但这并没有考虑到我想包含日期相同但位置不同的行。我正在使用 Postgresql 9.2。

4

2 回答 2

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从第二个表中排除相同位置和日期的行。看:

使用CREATE TABLE AS而不是SELECT INTO. 手册:

CREATE TABLE AS在功能上类似于SELECT INTOCREATE TABLE AS是推荐的语法,因为这种形式SELECT INTO 在 ECPG 或 PL/pgSQL 中不可用,因为它们对 INTO子句的解释不同。此外,CREATE TABLE AS还提供了SELECT INTO.

或者,如果目标表已经存在:

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

旁白:我不会date用作列名。它是每个 SQL 标准中的保留字,也是 Postgres 中的函数和数据类型名称。

于 2013-03-21T23:23:45.907 回答
1

将 UNION ALL 更改为 UNION,它应该只返回每个表中的唯一行。

于 2013-03-21T22:06:25.543 回答