【问题标题】:What's wrong with this SQL (Subquery using IN)?这个 SQL 有什么问题(使用 IN 的子查询)?
【发布时间】:2014-10-07 14:46:14
【问题描述】:

我正在使用 Access 中的一个联结表(实际上是一个定义父>子关系的自联接表)并且在我需要进行的一些联接方面遇到了麻烦。

我目前在一个查询中包含以下内容:

(SELECT AccountID
FROM tblAccount
WHERE AccountTypeID IN (1, 2))
UNION (SELECT ChildAccountID 
FROM qryAccJunctionDetails
WHERE (ParentAccountTypeID IN (1, 2)));

哪个工作正常:它提供AccountIDs 的列表,其中AccountTypeID 为1 或2,或者该帐户是另一个帐户的子帐户AccountTypeID = 1 或2。

当我尝试将其用作子查询来查找与此结果相关的其他字段值时,如下所示:

SELECT AccountName 
FROM qryAccountNamesConcat
WHERE AccountID IN(
    (
        SELECT AccountID
        FROM tblAccount
        WHERE AccountTypeID IN (1, 2)
    )
    UNION (
        SELECT ChildAccountID 
        FROM qryAccJunctionDetails
        WHERE (ParentAccountTypeID IN (1, 2))
    )
);

我收到错误:"Syntax error (missing operator) in query expression 'AccountID IN(...." 然后继续列出到语句的末尾。

我已经尝试过它的变体,但似乎无法让它发挥作用。可能是我完全误解了如何以这种方式将子查询放在一起。

编辑:现在修复了(ParentAccountTypeID IN (1, 2)) 末尾缺少的括号,但仍然出现相同的错误。

【问题讨论】:

  • 您在WHERE (ParentAccountTypeID IN (1, 2) 末尾缺少一个括号

标签: sql ms-access


【解决方案1】:

通过两个单独的比较来做到这一点:

SELECT AccountName 
FROM qryAccountNamesConcat
WHERE AccountID IN (SELECT AccountID
                    FROM tblAccount
                    WHERE AccountTypeID IN (1, 2)
                   ) OR
      AccountID IN (SELECT ChildAccountID 
                    FROM qryAccJunctionDetails
                    WHERE ParentAccountTypeID IN (1, 2)
                   );

这也可能有更好的性能。

【讨论】:

  • 这确实有效,但我很好奇为什么我的原始版本不能正常工作,因为据我所知它应该可以工作。关于我做错了什么有什么想法吗?
  • 我也很好奇为什么我在下面发布的代码不起作用
  • @Alex 。 . .您的代码有两组括号,这可能会导致 Access 关闭。另外,Access 对子查询中的union 非常挑剔。在这种情况下可能不允许使用它们。 Access 与标准和其他数据库有很大的不同,以至于当它不起作用时,很难说它为什么不起作用。
【解决方案2】:

关闭括号,试试这个

SELECT AccountName 
FROM qryAccountNamesConcat
WHERE AccountID IN(
    (
        SELECT AccountID
        FROM tblAccount
        WHERE AccountTypeID IN (1, 2)
    )
    UNION (
        SELECT ChildAccountID 
        FROM qryAccJunctionDetails
        WHERE (ParentAccountTypeID IN (1, 2)) <-- here
    )
);

【讨论】:

  • 是的,我是,但修复后我仍然遇到同样的错误。
  • 也许我们需要;在每个子查询之后
  • 不行,添加这些后仍然报同样的错误。
  • 呸,我想你可以试试 gordon 的代码。他是这里的主人。如果他的代码不起作用,我会尽力帮助你
  • Gordon 的代码确实有效,但我仍然想了解哪里出了问题,以提高我对应该如何使用 SQL 的一般理解。
猜你喜欢
  • 2018-04-27
  • 2011-01-15
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多