Sql 在超过100万行的表中,什么更有效?交叉连接还是子查询?

Sql 在超过100万行的表中,什么更有效?交叉连接还是子查询?,sql,database,performance,Sql,Database,Performance,我需要创建一个视图,该视图将过滤仅在辅助表的1行中设置的日期范围: 辅助日期表: start_date end_date ------------------------ 08/01/18 08/11/18 main_表 date subject -------------------------- 01/08/18 inoninoininoi 01/08/18 inoninoininoi 01/08/18 inoninoininoi 02/

我需要创建一个视图,该视图将过滤仅在辅助表的1行中设置的日期范围:

辅助日期表

start_date     end_date
------------------------
08/01/18       08/11/18
main_表

date        subject
--------------------------
01/08/18    inoninoininoi
01/08/18    inoninoininoi
01/08/18    inoninoininoi
02/08/18    inoninoininoi
02/08/18    inoninoininoi
02/08/18    inoninoininoi
03/08/18    inoninoininoi
03/08/18    inoninoininoi
03/08/18    inoninoininoi
04/08/18    inoninoininoi
.
.
.
第一种选择是:

select main_table.* 
from main_table, aux_date_table
where main_table.date between aux_date_table.start_date 
                          and aux_date_table.end_date
select main_table.* 
from main_table
where main_table.date between (select start_date from aux_date_table) 
  and (select end_date from aux_date_table)
第二种选择是:

select main_table.* 
from main_table, aux_date_table
where main_table.date between aux_date_table.start_date 
                          and aux_date_table.end_date
select main_table.* 
from main_table
where main_table.date between (select start_date from aux_date_table) 
  and (select end_date from aux_date_table)

哪个选项最有效?

我会使用
JOIN
而不是第一个选项或第二个选项,因为这将更清楚您想要做什么

select main_table.* from main_table 
INNER JOIN aux_date_table 
ON main_table.data between aux_date_table.start_date and aux_date_table.end_date
您的第一个选择是交叉连接,但风格陈旧

我建议您使用
交叉连接
而不是

select main_table.* 
from main_table CROSS JOIN aux_date_table
where main_table.data between aux_date_table.start_date and aux_date_table.end_date
如果你想选择哪一个更快,我会选择第一个选项


因为第二个选项在
性能可能比第一个更差的地方使用子查询。

我会使用
JOIN
而不是第一个选项或第二个选项,因为这样会更清楚您想要做什么

select main_table.* from main_table 
INNER JOIN aux_date_table 
ON main_table.data between aux_date_table.start_date and aux_date_table.end_date
您的第一个选择是交叉连接,但风格陈旧

我建议您使用
交叉连接
而不是

select main_table.* 
from main_table CROSS JOIN aux_date_table
where main_table.data between aux_date_table.start_date and aux_date_table.end_date
如果你想选择哪一个更快,我会选择第一个选项


因为第二个选项在
性能可能比第一个差的地方使用子查询。

如果aux_表只有一行,那么两种解决方案之间没有明显的差异。使用最“好看”的一个。什么是“MM”?你在第二个查询中是否缺少一个介于
之间的
?MM-Millions()@sticky bit-谢谢。调整如果aux_表只有一行,则两种解决方案之间没有明显差异。使用最“好看”的一个。什么是“MM”?你在第二个查询中是否缺少一个介于
之间的
?MM-Millions()@sticky bit-谢谢。调整某些DBMS不支持像MS Access那样的交叉连接,因此必须使用逗号。从OP的历史来看,OP使用MS Access.Perfect@Parfait!一些DBMS不支持像MS Access那样的交叉连接,因此必须使用逗号。从OP的历史来看,OP使用MS Access.Perfect@Parfait!