SQL LEFT JOIN清空左表列

时间:2016-08-18 09:19:44

标签: sql postgresql join

今天我在postgresql中遇到了一些奇怪的行为。

WITH actual_prices AS (
    -- Looking for prices from now to the given number of days back
    SELECT *
    FROM prices
    WHERE price_date >= now()::date - 93
)
, distinct_products_sold AS (
    SELECT distinct(id_product) as pid FROM products_sold
)
, first_prices AS (
    SELECT s.pid, p.product_id, p.price_date, p.price
    FROM   distinct_products_sold s
    LEFT   JOIN actual_prices p ON p.product_id = s.pid
)
select * from first_prices;

此代码输出此类内容:

129 | | |
195 | | |
251 | | |
...

换句话说,表actual_prices的列是空的。我尝试使用JOIN来查看正在发生的事情:如果我RIGHT JOIN代替LEFT JOIN,则会清空distinct_products_sold的列但{{1}的列正确显示。是什么导致这种情况?

3 个答案:

答案 0 :(得分:2)

你有错误的方法:不是外连接导致数据从一个表丢失,而是通过用空值填充缺少的列来强制表之间的联合,例如

WITH P ( PID ) AS
(
 SELECT *
   FROM (
         VALUES ( 1 ), ( 2 ), ( 3 )
        ) AS T ( C )
),
Q ( QID ) AS
(
 SELECT *
   FROM (
         VALUES ( 4 ), ( 5 ), ( 6 )
        ) AS T ( C )
)
SELECT p.PID, q.QID
  FROM P p, Q q
 WHERE p.PID = q.QID
UNION
SELECT p.PID, NULL
  FROM P p
 WHERE p.PID NOT IN ( SELECT QID FROM Q );

答案 1 :(得分:0)

请原谅我的脑力。原来它输出无与伦比的结果(多么令人惊讶)。 LEFT / RIGHT Joins也输出左表或右表的无与伦比的结果。

P.S。在发布问题之前启动。

答案 2 :(得分:-1)

此处不需要WITH子句,请尝试:

SELECT t.pid , p.product_id, p.price_date, p.price
FROM (SELECT distinct id_product as pid FROM products_sold) t
LEFT JOIN prices p 
 ON(t.pid = p.product_id AND p.price_date >= now()::date - 93)

如果表prices中的所有列仍为NULL,则表示没有匹配。

左连接保留前导表(左表)中的所有记录,只保留右表中的匹配数据。