是JOIN子查询,作为表创建一次还是每次重新评估?

时间:2013-08-02 15:45:44

标签: sql join subquery

假设我在以较大的查询别名为“整体”

时将以下内容作为联接
        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语句外。我的问题是哪个通常更有效率?

3 个答案:

答案 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

这是引用子查询范围内不存在的两个表别名。我不确定你使用的是什么数据库,但我不知道有任何允许这样做的范围规则(违反标准)。

可以SELECTWHEREHAVING子句中的相关子查询中执行此操作。如果是这种情况,您应该显示更多的整体查询。您拥有的代码段看起来不像有效的SQL语法。