【问题标题】:Postgres INNER JOINPostgres 内部联接
【发布时间】:2013-11-06 11:09:11
【问题描述】:

在我的查询中,我只想在第一个表的指定列为空时才加入表。我怎样才能加入。这是一个 INNER JOIN,有 3 个表。

这是我的问题。

SELECT item_id,item_name
  FROM item i
INNTER JOIN supplier s ON i.item_id=s.items_id
INNER JOIN order O ON O.id=s.req_id
WHERE price>400 AND category='ALL'; 

只有当 item 表中的列 'item_order_id' 为 NULL 时,此连接才可用。如果该列不为空,则不应完成此连接。我如何在 Postgres 中进行操作(我使用 postgres 8)。

【问题讨论】:

  • 在 where 子句中添加 AND i.item_order_id IS NULL ?
  • "Postgres 8" 涵盖五个主要版本(8.0、8.1、8.2、8.3 和 8.4) - 您应该说明您的确切版本。另请注意,仍然仅支持 8.4(但仅支持几个月),因此您应该真正计划升级到当前(例如 9.3)版本。
  • 我用的是 8.0.3。版本升级可能是个好主意。但是对于我的系统环境,我必须保持当前版本。

标签: sql postgresql


【解决方案1】:

选项 1. 将条件放在 WHERE 子句中:

SELECT item_id,item_name
  FROM item i
INNER JOIN supplier s ON i.item_id=s.items_id
INNER JOIN order O ON O.id=s.req_id
WHERE price>400 AND category='ALL' AND i.item_order_id IS NULL; 

选项 2. 将条件放入连接中:

SELECT item_id,item_name
  FROM item i
INNER JOIN supplier s ON i.item_id=s.items_id AND i.item_order_id IS NULL
INNER JOIN order O ON O.id=s.req_id
WHERE price>400 AND category='ALL' ; 

【讨论】:

  • 感谢您的回复。但是,我在函数中使用此查询。仅当 item_order_id 为空时才应进行此连接。我们不能把这个加入放在 where 子句中吗?我的意思是这样的,在函数内部和 where 子句 CASE when item_order_id IS NULL ..
  • 我不明白你的顾虑是什么。选项 2 仅连接那些 item_order_id 为空的记录。两个选项产生相同的结果。可能存在性能问题,因此如果您担心这是您应该检查两个选项的解释计划(针对满载的表)。
  • @KlasLindbäck:不,没有性能问题。这两个查询将生成完全相同的计划。
猜你喜欢
  • 2012-07-19
  • 2010-10-16
  • 2017-11-03
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多