【问题标题】:I am having trouble with my SQL query in PostgreSQL我在 PostgreSQL 中的 SQL 查询有问题
【发布时间】:2016-10-04 01:53:27
【问题描述】:

我想要做的是从parts 获取所有记录以及来自oelineitem 的任何记录,其中parts.id 等于owlineitems.part_id 以及我需要来自表oe 的几个字段。

对于oelineitems 中的每一行(多对一关系),我保证在oe 中有一行,但对于parts 中的每一行,我不能保证在oelineitem 中有一行。即使oelineitem 中没有行,我也需要parts 中的行在数据集中。

我的查询:

SELECT parts.partnumber, 
       parts.description, 
       parts.bin, 
       parts.obsolete, 
       orderitems.qty, 
       oe.transdate 
FROM   parts 
LEFT JOIN orderitems 
       ON parts.id = orderitems.parts_id
LEFT JOIN oe 
       ON orderitems.trans_id = oe.id 
WHERE  oe.customer_id <> 12228
ORDER  BY part.partnumber; 

【问题讨论】:

  • 你的问题到底是什么?

标签: postgresql left-join outer-join


【解决方案1】:

将条件从 WHERE 移至 ON:

SELECT parts.partnumber, 
       parts.description, 
       parts.bin, 
       parts.obsolete, 
       orderitems.qty, 
       oe.transdate 
FROM   parts 
LEFT JOIN orderitems 
       ON parts.id = orderitems.parts_id
LEFT JOIN oe 
       ON orderitems.trans_id = oe.id 
       AND oe.customer_id <> 12228
ORDER  BY part.partnumber;

您是外部连接记录。因此,如果没有匹配项,您可以加入一个所有列都为 NULL 的虚拟记录。如果您询问WHERE oe.customer_id &lt;&gt; 12228,您会忽略这些记录,因此您会删除所有外连接记录,并且您将进入仅使用内连接的位置。

(因为NULL &lt;&gt; 12228 的结果为 null,而不是 true。)

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多