假设我在以较大的查询别名为“整体”
时将以下内容作为联接 INNER JOIN (SELECT
tts.typ,tts.amount,
tts.term_sale_id,
tts.term_sale_id,
tts.from_price
FROM tb_term_sale_entries tts
WHERE tts.start_date <= '#dateformat(now(),'mm/dd/yyyy')# 23:59:00'
AND tts.end_date >= '#dateformat(now(),'mm/dd/yyyy')# 23:59:00'
AND tts.style_id = overall.style_id) term_sale ON (tts.style_id = overall.style_id)
当SQL处理此查询时,是否会创建term_sale表一次,然后根据需要加入它,还是为主查询的每一行创建term_sale?
在上面,我有两次连接条件,一次在子查询中,一次在join语句外。我的问题是哪个通常更有效率?
答案 0 :(得分:1)
查看查询执行计划(How do I obtain a Query Execution Plan?)可以帮助您确定哪两个选项更有效。
在这种情况下,我99%表示您希望将条件保留在子查询中,从而限制结果集,这应该使连接和查询更有效。基本上,最好是加入较小的表/结果集而不是较大的表。
答案 1 :(得分:1)
因为它被视为子查询SQL引擎执行term_sale并对执行此查询后创建的数据集进行操作。只有比较部分即On 部分是逐行完成的。
问候
Ashutosh Arya
答案 2 :(得分:0)
假设这是从查询的from
子句中获取的(假设它以inner join
开头,这是一个非常合理的假设),所提出的语句是错误的SQL:
INNER JOIN
(SELECT tts.typ,tts.amount, tts.term_sale_id, tts.term_sale_id, tts.from_price
FROM tb_term_sale_entries tts
WHERE tts.start_date <= '#dateformat(now(),'mm/dd/yyyy')# 23:59:00' and
tts.end_date >= '#dateformat(now(),'mm/dd/yyyy')# 23:59:00' and
tts.style_id = overall.style_id and b.store_id = 99
--------------------------^ UNDEFINED ---------^ UNDEFINED
) term_sale
ON term_sale.style_id = overall.style_id
这是引用子查询范围内不存在的两个表别名。我不确定你使用的是什么数据库,但我不知道有任何允许这样做的范围规则(违反标准)。
您可以在SELECT
,WHERE
或HAVING
子句中的相关子查询中执行此操作。如果是这种情况,您应该显示更多的整体查询。您拥有的代码段看起来不像有效的SQL语法。