Еще один вид запросов слишком сложен в MS Access - PullRequest
0 голосов
/ 14 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...