SQL - 左连接后丢失列

SQL - Losing columns after a left join

这是我在数据库 Fiddle 中的内容(使用 PostgreSQL v9.6):

样本table:

CREATE TABLE sample_table (
  seller_id varchar(255),
  week varchar(255),
  week_end  timestamp,
  year  integer,
  product_id varchar(255),
  num_sold  integer,
  dollars_sold  integer
);

填充了虚假数据:

INSERT INTO sample_table (seller_id, week, week_end, year, product_id, num_sold, dollars_sold)
VALUES ('12345A', '01/01/2020 - 01/07/2020', '01/07/2020', 2020, '1A', 1, 5),
       ('12345A', '01/08/2020 - 01/14/2020', '01/14/2020', 2020, '1A', 2, 10),
       ('12345A', '01/15/2020 - 01/21/2020', '01/21/2020', 2020, '1A', 3, 15),
       ('12345B', '01/01/2020 - 01/07/2020', '01/07/2020', 2020, '1A', 2, 10),
       ('12345B', '01/08/2020 - 01/14/2020', '01/14/2020', 2020, '1A', 4, 20),
       ('12345B', '01/15/2020 - 01/21/2020', '01/21/2020', 2020, '1A', 6, 30),
       ('12345C', '01/01/2020 - 01/07/2020', '01/07/2020', 2020, '1A', 1, 5),
       ('12345C', '01/08/2020 - 01/14/2020', '01/14/2020', 2020, '1A', 2, 10),
       ('12345C', '01/15/2020 - 01/21/2020', '01/21/2020', 2020, '1A', 3, 15),
       ('12345D', '01/01/2020 - 01/07/2020', '01/07/2020', 2020, '1A', 5, 25),
       ('12345D', '01/08/2020 - 01/14/2020', '01/14/2020', 2020, '1A', 10, 50),
       ('12345D', '01/15/2020 - 01/21/2020', '01/21/2020', 2020, '1A', 15, 75),
       ('12345E', '01/01/2020 - 01/07/2020', '01/07/2020', 2020, '1A', 3, 15),
       ('12345E', '01/08/2020 - 01/14/2020', '01/14/2020', 2020, '1A', 6, 30),
       ('12345E', '01/15/2020 - 01/21/2020', '01/21/2020', 2020, '1A', 9, 45);

我的查询:

SELECT a.* FROM (SELECT     x.week_end, 
           x.week, 
           x.year, 
           y.product_id, 
           z.seller_id 
FROM       ( 
                           SELECT DISTINCT week_end, 
                                           year, 
                                           week 
                           FROM            sample_table) x 
CROSS JOIN 
           ( 
                           SELECT DISTINCT product_id 
                           FROM            sample_table) y 
CROSS JOIN 
           ( 
                           SELECT DISTINCT seller_id 
                           FROM            sample_table) z) AS a
LEFT JOIN sample_table b
ON 
a.seller_id = b.seller_id
AND 
a.week_end = b.week_end 
AND 
a.product_id = b.product_id;

这是我期望发生的事情:查询从 table 中获取 week + week_end + year 的每个现有组合,将其与每个现有组合交叉连接product_id,然后将结果与每个现有的 seller_id 交叉连接。虽然我的示例 table 没有反映这一点,但我正在处理的实际 table 缺少行,目标是通过创建已存在的每个行组合来生成那些缺少的行。例如,如果卖家 12345A 在 2020 年 1 月 1 日至 2020 年 7 月 01 日这一周缺少特定产品的数据,则在此操作之后将创建缺失的行。

关于这个问题:在交叉连接后,我想将 table 左连接回自身,以便将 num_solddollars_sold 数据带回那些行已经存在(并且生成的任何缺失行都将显示为空)。

在我的 left join 之后,num_solddollars_sold 列不见了,我很困惑。我从另一个与这个非常相似的 table 复制了查询,并简单地更改了几个列名。我复制的查询完全按照规定工作,但是当我 运行 这个新的 table 上的修改查询时,这两列没有通过左连接。

这些列在左联接的输入和结果中。它们不在 x、y、z 或 CROSS JOIN 结果中。您可以使用或不使用别名 b 来命名它们。但是您并没有在最外层的 SELECT 子句中选择它们。

您已创建 a 以获得 week/product/seller 的所有组合。仅 selecting a.* 将不会显示除 week/product/seller 之外的任何其他数据 。 您错过了使用别名 b 从左连接中包含这些字段(num_sold 和 dollars_sold),因此基本上您需要使用 [=将它们添加到主 select =13=]别名:

SELECT a.*, b.sum_sold, b.dollars_sold FROM 
 (SELECT     x.week_end, 
           x.week, 
           x.year, 
           y.product_id, 
           z.seller_id 
FROM       ( 
                           SELECT DISTINCT week_end, 
                                           year, 
                                           week 
                           FROM            sample_table) x 
CROSS JOIN 
           ( 
                           SELECT DISTINCT product_id 
                           FROM            sample_table) y 
CROSS JOIN 
           ( 
                           SELECT DISTINCT seller_id 
                           FROM            sample_table) z) AS a 
LEFT JOIN sample_table b ON 
a.seller_id = b.seller_id
AND 
a.week_end = b.week_end 
AND 
a.product_id = b.product_id;