我今天在使用 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
,它会清空 的列code>distinct_products_sold
但 actual_prices
的列显示正确。什么会导致这种情况?
最佳答案
您的理解方式是错误的:并不是外连接导致数据从一个表中丢失,而是它通过用空值填充缺失的列来强制表之间的并集,例如
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 );
关于SQL LEFT JOIN 清空左表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39014395/