使用EXISTS而不是IN重写此查询会更好吗?我该怎么办?

时间:2014-10-14 08:07:30

标签: sql ms-access

我目前有以下内容,并且我已经读过,通常最好避免使用“IN”并改为使用“EXISTS”(12)。虽然我已经读过EXISTS更快更一致,但我认为我并没有完全理解为什么会这样,或者我将如何重写它来使用EXISTS。

SELECT qryAccountNamesConcat.AccountID, qryAccountNamesConcat.AccountName, qryAccountNamesConcat.JobTitle
FROM qryAccountNamesConcat
WHERE (((qryAccountNamesConcat.AccountID) In (
    SELECT AccountID
    FROM tblAccount
    WHERE AccountTypeID IN (1, 2)) 
Or 
qryAccountNamesConcat.AccountID In (
    SELECT ChildAccountID 
    FROM qryAccJunctionDetails
    WHERE ParentAccountTypeID IN (1, 2))
));

基本上,在AccountTypeID = 1或2的情况下,这是一个交易或私人客户账户,所以我正在寻找客户账户(或通常是客户账户的子公司)的子账户。

2 个答案:

答案 0 :(得分:2)

我不知道exists对于MS Access是否优于in(尽管exists在其他数据库中的表现通常优于in。但是,您可以将其写为:

SELECT anc.AccountID, anc.AccountName, anc.JobTitle
FROM qryAccountNamesConcat as anc
WHERE EXISTS (SELECT 1
              FROM tblAccount as a
              WHERE a.AccountTypeId in (1, 2) and anc.AccountID = a.AccountID
             ) OR
      EXISTS (SELECT 1
              FROM qryAccJunctionDetails as jd
              WHERE jd.ParentAccountTypeID in (1, 2) and jd.ChildAccountID = anc.AccountID
             );

为获得最佳效果,您需要tblAccount(AccountId, AccountTypeId)qryAccJunctionDetails(ChildAccountID, ParentAccountTypeID)上的索引。

答案 1 :(得分:1)

根据数据,一个或另一个可能是最快的;因此,您必须使用自己的数据进行尝试,以了解哪一个最适合您的查询。

对于IN的不一致性,当有可能具有Null值时存在问题。例如,以下第一个查询将返回一行;其他两个不会返回任何东西:

Select 1 where 1 in (1, Null);
Select 1 where 2 Not in (1, Null);
Select 1 where Null in (1, Null);

此示例适用于SQL Server。对于MS Access,我认为您必须指定FROM MyTable语句来尝试它。 (当然,第一个查询返回的行数将等于表MyTable中的总行数。)