比较内连接的用法和in连接的用法

时间:2017-04-05 01:58:27

标签: sql postgresql

有两个表格 - PODsStatefulSet

all_dataselected_place_day_hoursall_dataplace_idday

hour包含字段metricselected_place_day_hoursplace_id

我需要对day进行分组,以便只选择hourall_dataplace_idday的记录。

我可以通过两种方式解决它

1.使用hour

selected_place_day_hours

2.使用inner join

select a.*
from all_data as a
inner join selected_place_day_hours as b
on (a.place_id = b.place_id)
and ( a.day = b.day)
and ( a.hour = b.hour)
;

我想知道为什么,何时,如果你从功能和性能的角度选择一个而不是另一个?

有一种想法是,在上面的#2中,可能是子选择不是性能友好的,而且代码也更长。

3 个答案:

答案 0 :(得分:1)

这两者在语义上是不同的。

IN执行半联接,这意味着无论all_data中匹配了多少行,它都会从selected_place_day_hours返回一个。

JOIN可以返回多行。

因此,第一条建议是使用适合您想要完成的版本。

假设select_place_day_hours中的数据最多保证一次匹配,那么您就遇到了性能问题。第一条建议是尝试对数据和系统进行查询。但是,JOIN通常至少与IN一样优化,因此这通常是一种安全的选择。

答案 1 :(得分:1)

现在,SQL倾向于忽略你所说的并做自己的事情。

这就是为什么SQL是声明性语言,而不是编程语言:你告诉它你想要什么,而不是如何做。 SQL解释器将找出你想要的东西,并设计自己的计划来获得结果。

在这种情况下,无论您如何编写,2个版本都可能会生成相同的计划。无论如何,所选择的计划将是最有效的计划。

优先使用join语法而不是旧where语法的原因是:

  • 看起来很酷:你不希望任何人用老式的代码抓住你
  • join语法很容易适应外连接
  • join语法允许您通过区分joinwhere
  • 将连接部分与其他过滤器分开

的原因包括是否更好,因为解释器会处理它。

答案 2 :(得分:0)

这些是一些注释太长的注释。

首先应该证明你的两个查询是不同的。 (也许你写的第二个查询是错误的查询)

例如:

<强> all_data

place_id    day     hour    other_cols...
1           4       3       ....

<强> selected_place_day_hours

place_id    day     hour
1           4       9
4444        4444    6 

然后您的第一个查询将获得无行作为回报,您的第二将返回(1, 4, 6)

还有一点需要注意,如果(place_id, day, hour)是唯一的,那么您的第一个查询与查询的目的相同

SELECT *
FROM all_data
WHERE 
    (place_id, day, hour) IN (
        SELECT place_id, day, hour
        FROM selected_place_day_hours
    );