我有一个已经投入生产几年的应用程序,因此我们知道它生成的SQL通常是有效的,在这种情况下,将表导入SQL Server 2016可以在其中运行相同的查询而不会出现问题。与我在此处发布的查询相比,实际查询要涉及得多(很多嵌套级别和多JOIN子查询),并且它总是运行,除非在此大大简化的示例中有所说明。即使在MS Access查询窗口本身中,这种简单的程序也无法运行。
SELECT *
FROM (SELECT individual_tests.*
,(SELECT TOP 1 test_categories.id FROM test_categories INNER JOIN performance_categories ON performance_categories.test_category_id = test_categories.id
WHERE performance_categories.id = individual_tests.performance_category_id) AS UsedInWhere
, (SELECT TOP 1 standard_designations.inactive_flag
FROM ((standard_designations
INNER JOIN standard_designation_revision_levels ON standard_designation_revision_levels.standard_designation_id = standard_designations.id)
INNER JOIN individual_tests_standard_rev_levels ON individual_tests_standard_rev_levels.standard_designation_revision_level_id = standard_designation_revision_levels.id)
INNER JOIN individual_tests ON individual_tests.id = individual_tests_standard_rev_levels.individual_test_id
) AS UnusedResultAnyway
FROM individual_tests_standard_rev_levels INNER JOIN
individual_tests
ON individual_tests.id = individual_tests_standard_rev_levels.individual_test_id
) AS individual_tests
WHERE (UsedInWhere = 1);
我可以对查询进行各种更改,以使其运行无误,但它们违反了查询的目的。
如果我更改底部的WHERE而不引用任何一个子查询的结果,它将运行。如果我将其中一个子查询简化为
(1) AS UsedInWhere
或
(1) AS UnusedResultAnyway
一切正常。 IOW,我不必简化计算UsedInWhere的子查询就可以在WHERE中使用该值。仅简化或删除另一个子查询就可以使查询工作不带
查询太复杂
错误。在某些情况下,我发现通过添加逻辑上不必要的嵌套级别使其他查询变得更加复杂,从而使错误消失了,但是我们不想依靠这些东西。
我的方法是否存在一些概念上较弱的问题,即使SQL Server没有抱怨也不应使用?我是否应该只接受MS Access有时无法处理有效和简单的SQL,并设计一种变通方法,例如使用内存中的表(而不是一个查询)来进行填充?