【问题标题】:Microsoft Access union query causing "Query too complex" errorMicrosoft Access 联合查询导致“查询太复杂”错误
【发布时间】:2019-09-04 18:35:25
【问题描述】:

我有八个表格,其中包含有关对整个公司的应用程序进行更改的信息。我只想查询和组合 200 多个应用程序子集的行。为此,我通过应用程序代码(AAA、BBB 等)查询每个表,并希望合并结果。当我使用超过 5 个应用程序代码时,我收到错误“查询复杂”。

我知道有一种更有效的方法可以做到这一点,但以下是我在有限的知识范围内所能做到的最好的方法。

SELECT * FROM [2019-07-A July 5 to 7]   WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-07-B July 12 to 14] WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-07-C July 19 to 21] WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-07-D July 26 to 28] WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-08-A Aug 2 to 4]    WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-08-B Aug 9 to 11]   WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-08-C Aug 16 to 18]  WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-08-D Aug 23 to 25 Proposed] WHERE [Application code] LIKE 'AAA' UNION ALL 
SELECT * FROM [2019-07-A July 5 to 7]   WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-07-B July 12 to 14] WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-07-C July 19 to 21] WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-07-D July 26 to 28] WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-08-A Aug 2 to 4]    WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-08-B Aug 9 to 11]   WHERE [Application code] LIKE 'BBB' UNION ALL 
SELECT * FROM [2019-08-C Aug 16 to 18]  WHERE [Application code] LIKE 'BBB' UNION ALL
SELECT * FROM [2019-08-D Aug 23 to 25 Proposed] WHERE [Application code] LIKE 'BBB';

我希望能够一次查询所有 200 多个应用程序代码,并且比每个代码输入相同的字符串 8 次更有效。

【问题讨论】:

  • 您是否在like 语句的条件内使用通配符运算符?
  • 除了合并表之外的所有其他操作都会创建非规范化数据,这会导致问题,例如Query to complex或执行缓慢。如果您需要单独的表,您可以通过创建包含该数据的查询来模拟它们(根据前表名过滤组合表)。
  • 通常,应用程序的更改由 aVersion control systems (VCS) 跟踪。你有什么理由不这样做?

标签: sql ms-access


【解决方案1】:

更简单的方法是在应用选择标准之前union 表格数据,这样您只需在 一个 位置指定标准,例如:

select * from
(
    select * from [2019-07-A July 5 to 7]   union all 
    select * from [2019-07-B July 12 to 14] union all 
    select * from [2019-07-C July 19 to 21] union all 
    select * from [2019-07-D July 26 to 28] union all 
    select * from [2019-08-A Aug 2 to 4]    union all 
    select * from [2019-08-B Aug 9 to 11]   union all 
    select * from [2019-08-C Aug 16 to 18]  union all 
    select * from [2019-08-D Aug 23 to 25 Proposed]
) as t
where
    t.[Application code] like 'AAA' or
    t.[Application code] like 'BBB'

如果您like 语句的条件内使用通配符运算符,您也可以使用in 运算符并提供应用程序代码列表:

select * from
(
    select * from [2019-07-A July 5 to 7]   union all 
    select * from [2019-07-B July 12 to 14] union all 
    select * from [2019-07-C July 19 to 21] union all 
    select * from [2019-07-D July 26 to 28] union all 
    select * from [2019-08-A Aug 2 to 4]    union all 
    select * from [2019-08-B Aug 9 to 11]   union all 
    select * from [2019-08-C Aug 16 to 18]  union all 
    select * from [2019-08-D Aug 23 to 25 Proposed]
) as t
where
    t.[Application code] in ('AAA', 'BBB')

或者,您可以创建一个包含您希望返回的所有应用程序代码的表(在以下示例中,我将此类表称为 ApplicationCodes,其中包含一个名为 Code 的单个字段),然后使用简单的join 隐式应用过滤,例如:

select * from
(
    select * from [2019-07-A July 5 to 7]   union all 
    select * from [2019-07-B July 12 to 14] union all 
    select * from [2019-07-C July 19 to 21] union all 
    select * from [2019-07-D July 26 to 28] union all 
    select * from [2019-08-A Aug 2 to 4]    union all 
    select * from [2019-08-B Aug 9 to 11]   union all 
    select * from [2019-08-C Aug 16 to 18]  union all 
    select * from [2019-08-D Aug 23 to 25 Proposed]
) as t 
inner join ApplicationCodes on t.[Application code] = ApplicationCodes.Code

【讨论】:

  • 不确定通配符运算符是什么(我不是开发人员,也没有 sql 经验)。您对包含我们要查询的应用程序代码的附加表的最后建议就像一个魅力!感谢您的帮助,并快速回复
  • 不客气。单击我对like 运算符文档的回答中的链接,您将看到可用的通配符运算符(例如*?# 等),您可以在提供的模式中使用它们like 运算符。
【解决方案2】:

我建议您创建一个包含所有应用程序的表,然后您只需执行 8 个查询

SELECT * FROM [2019-07-A July 5 to 7] f, [Applications]  a 
 WHERE f.[Application code] = a.[Application code] UNION ALL
SELECT * FROM [2019-07-B July 12 to 14] f, [Applications]  a 
 WHERE f.[Application code] = a.[Application code] UNION ALL
etc...

如果你不喜欢这样,你可以试试 IN 子句

SELECT * FROM [2019-07-A July 5 to 7]   WHERE [Application code] IN 
( 'AAA','BBB','CCC','DDD', etc...) UNION ALL 
SELECT * FROM [2019-07-B July 12 to 14] WHERE [Application code] IN 
( 'AAA','BBB','CCC','DDD', etc...) UNION ALL ALL 

【讨论】:

  • 我强烈建议在笛卡尔积和 where 子句上使用连接。
  • 我误解了你的回答。我以为您想像我的回答一样合并表格,而不仅仅是将应用程序提取到新表格中。
【解决方案3】:

包含日期或序列号以及相同字段的表名,通常应与表名组合作为附加属性。

使用联合表的字段创建一个表(例如 ApplicationChanges),并添加一个附加字段ChangedAt,它将保存旧表名称。 也许旧表包含一个日期字段,显示日期ChangedAt,那么您可以省略表名并查询哪些日期属于whis表。

然后使用@LeeMacs 查询填充新表:

INSERT INTO ApplicationChanges
FROM
    (
        SELECT
            [2019-07-A July 5 to 7].*
          , '[2019-07-A July 5 to 7]' AS ChangedAt
        FROM
            [2019-07-A July 5 to 7]

        UNION ALL

        SELECT
            [2019-07-B July 12 to 14].*
          , '[2019-07-B July 12 to 14]' AS ChangedAt
        FROM
            [2019-07-B July 12 to 14]

        UNION ALL

        SELECT
            [2019-07-C July 19 to 21].*
          , '[2019-07-C July 19 to 21]' AS ChangedAt
        FROM
            [2019-07-C July 19 to 21]

        UNION ALL

        SELECT
            [2019-07-D July 26 to 28]*
          , '[2019-07-D July 26 to 28]' AS ChangedAt
        FROM
            [2019-07-D July 26 to 28]

        UNION ALL

        SELECT
            [2019-08-A Aug 2 to 4].*
          , '[2019-08-A Aug 2 to 4]' AS ChangedAt
        FROM
            [2019-08-A Aug 2 to 4]

        UNION ALL

        SELECT
            [2019-08-B Aug 9 to 11].*
          , '[2019-08-B Aug 9 to 11]' AS ChangedAt
        FROM
            [2019-08-B Aug 9 to 11]

        UNION ALL

        SELECT
            [2019-08-C Aug 16 to 18].*
          , '[2019-08-C Aug 16 to 18]' AS ChangedAt
        FROM
            [2019-08-C Aug 16 to 18]

        UNION ALL

        SELECT
            [2019-08-D Aug 23 to 25 Proposed].*
          , '[2019-08-D Aug 23 to 25 Proposed]' AS ChangedAt
        FROM
            [2019-08-D Aug 23 to 25 Proposed]
    )
    AS t

如果您需要旧数据结构,请为之前的每个表创建查询,并使用 ChangedAt 作为条件。 例如。表[2019-07-A July 5 to 7]

SELECT *
FROM
    ApplicationChanges
WHERE
    ChangedAt = '[2019-07-A July 5 to 7]'
    AND [Application code] IN ('AAA'
                             , 'BBB');

不再需要缓慢的联合查询,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多