sql – 将两个表合并为一个新表,以便忽略另一个表中的选择行

前端之家收集整理的这篇文章主要介绍了sql – 将两个表合并为一个新表,以便忽略另一个表中的选择行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个具有相同列的表.我想将这两个表一起连接到第三个表中,第三个表包含第一个表中的所有行,而第二个表中的所有行都具有相同位置的第一个表中不存在的日期.

例:

交易方式:

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.

解决方法

根据您的描述,查询可能如下所示:
我使用LEFT JOIN / IS NULL来排除第二个表中相同位置和日期的行. NOT EXISTS将是另一个不错的选择.
UNION根本不做你所描述的.
CREATE TABLE AS 
SELECT date,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

@H_301_33@

CREATE TABLE AS is functionally similar to SELECT INTO. CREATE TABLE AS
is the recommended Syntax,since this form of SELECT INTO is not
available in ECPG or PL/pgsql,because they interpret the INTO clause
differently. Furthermore,CREATE TABLE AS offers a superset of the
functionality provided by SELECT INTO.

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

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

我建议不要使用日期作为列名.它是每个sql标准中的reserved word以及Postgresql中的函数和数据类型名称.

猜你在找的MsSQL相关文章