最有效的 SQL 语句:存在与 IN

Most efficient SQL Statement: Exists vs IN

我需要 JOIN 三个表来从两列中获取值。 这些列是 GRN_STATUSSTATUS 我已经写了一些 SQL 来达到预期的结果,但我被告知使用 IN 效率很低,我应该使用 EXISTS 代替。

我只是想知道我的情况是否如此?使用 EXISTS 而不是 IN 的解决方案会是什么样子?

SQL:

SELECT c.GRN_STATUS, a.STATUS
FROM
    TableA a
        INNER JOIN
    TableB b
        ON a.ORD_NO = b.ORD_NO
        AND a.COMPANY_ID = b.COMPANY_ID
        INNER JOIN
    TableC c
        ON b.GRN_NO = c.GRN_NO
        AND b.COMPANY_ID = c.COMPANY_ID
AND a.STATUS IN ( 'B', 'C', 'D', 'E' )
AND c.GRN_STATUS = 'A';

一般来说,这取决于DBMS中的实现。

EXISTS 大多在第一次匹配时停止并且 returns 所以它可能更有效,但是当你有一个常量列表时它没有意义。

由于 SQL 是一种声明性语言,您不能告诉 DBMS 如何,只能告诉 DBMS 是什么。您描述了预期的结果,服务器会尝试找到最有效的方式来满足您的请求。

DBMS 找到高效算法的方式基于多种因素,包括数据的数量和分布、实际统计数据、所需的预期资源等。

所以 EXISTS 可能在大 table 上表现更好,而对小 table 没有影响(反之亦然)。

最好的办法是实际检查估计的查询计划或试用它们。

个人观点是不需要数据的时候用EXISTS,需要数据的时候用JOIN。 IN 用于常量列表。