今天我在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}的列正确显示。是什么导致这种情况?
答案 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,则表示没有匹配。
左连接保留前导表(左表)中的所有记录,只保留右表中的匹配数据。