我目前有以下内容,并且我已经读过,通常最好避免使用“IN”并改为使用“EXISTS”(1,2)。虽然我已经读过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的情况下,这是一个交易或私人客户账户,所以我正在寻找客户账户(或通常是客户账户的子公司)的子账户。
答案 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中的总行数。)