У меня есть приложение, которое работало в течение нескольких лет, поэтому мы знаем, что генерируемый им SQL в целом действителен, и в этом случае импорт таблиц в SQL Server 2016 позволяет без проблем выполнять те же запросы.Фактический запрос гораздо более сложный (гораздо больше уровней вложенности и подзапросов multi-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, который является одновременно действительным и простым, и разработать обходной путь, используя что-то вроде таблицы в памяти, которую я могу заполнять по частям вместо одного запроса?