0

假设我在一个别名为“整体”的更大查询中加入以下内容

        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?

在上面,我有两次连接条件,一次在子查询中,一次在连接语句中。我的问题是哪个通常更有效?

4

3 回答 3

1

查看查询执行计划(如何获得查询执行计划?)应该可以帮助您确定这两个选项中的哪一个更有效。

不过,在这种情况下,我 99% 都希望您将条件保留在子查询中,从而限制该结果集,这应该会使连接和查询更有效。基本上,加入较小的表/结果集比加入较大的表/结果集更好。

于 2013-08-02T16:57:53.333 回答
1

由于它被视为子查询,SQL 引擎执行 term_sale 并对执行此查询后创建的数据集进行操作。只有比较部分,即 On 部分是逐行完成的。

问候

阿舒托什·艾莉亚

于 2013-08-02T16:58:19.947 回答
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在、WHEREHAVING子句中的相关子查询中执行此操作。如果是这种情况,您应该显示更多的整体查询。您拥有的代码段看起来不像有效的 SQL 语法。

于 2013-08-02T16:51:47.427 回答