有两个表格 - PODs
和StatefulSet
all_data
有selected_place_day_hours
,all_data
,place_id
,day
hour
包含字段metric
,selected_place_day_hours
,place_id
我需要对day
进行分组,以便只选择hour
中all_data
,place_id
,day
的记录。
我可以通过两种方式解决它
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中,可能是子选择不是性能友好的,而且代码也更长。
答案 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
语法允许您通过区分join
和where
不的原因包括是否更好,因为解释器会处理它。
答案 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
);