SQL LEFT JOIN 清空左表列

标签 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,它会清空 的列code>distinct_products_soldactual_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/

相关文章:

sql - 有条件地替换 jsonb 列中每行的单个值

java - 什么方法加入实体更快?

sql - 该月的每日平均值(需要该月的天数)

SQL:如果一列中的条目对应于不同表的另一列,则选择

mysql - 如何连接多个表?

sql - SPARQL : Find Difference and Common Elements in 2 Sets

mysql - 在 SQL 中使用 Count 函数进行减法常量

sql - 如何根据字段值加入变量表?

php - 添加到数组值

mysql - MySql 中连接 4 个表时出现重复数据