Почему использование подзапроса в левом соединении дает совершенно другой ответ, чем эквивалентная таблица? - PullRequest
3 голосов
/ 11 апреля 2019

Я использую левое соединение в запросе Access, чтобы получить таблицу с добавленным столбцом, которая применяется только к нескольким строкам. Когда я использую подзапрос в качестве объединяемой таблицы, он дает мне окончательную таблицу с новым столбцом, имеющим одинаковое значение для всех строк. Когда я создаю таблицу, которая дает тот же самый вывод, что и подзапрос, он работает так, как я хочу. Почему подзапрос и таблица дают разные результаты, если они выглядят одинаково.

Я просмотрел другие вопросы о разнице между таблицей и производной таблицей (что, по-моему, я получаю, используя подзапрос), и, похоже, между ними нет разницы.

SELECT *
FROM Table1 
  LEFT JOIN 
    (SELECT *, "P" AS PColumn FROM TableX, TableY WHERE TableX.x = TableY.y) AS Table2 
  ON (Table1.x = Table2.x)
WHERE Table1.X > 2

Каждое значение в PColumn "P". Когда я создаю таблицу, которая выглядит точно так же, как результат подзапроса, и использую ее вместо подзапроса, только строка 5 имеет значение PColumn «P», а остальные значения равны нулю, чего я и хочу. Подзапрос и таблица имеют одинаковые значения, но разные выходные данные во внешнем операторе SELECT

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Как следует из комментариев, это выглядит как еще одно возникновение ошибки, присутствующей в оптимизаторе запросов ядра базы данных JET, используемого MS Access при оценке внешних объединений, как описано Алленом Брауном в его статье здесь .

Рассмотрим следующее MCVE , демонстрирующее ошибку:

Table1

+----+
| ID |
+----+
|  1 |
|  2 |
+----+

Table2

+----+
| ID |
+----+
|  1 |
+----+

SQL

select * from table1 left join (select table2.id, "x" as X from table2) q on table1.id = q.id

Должен вернуть:

+-----------+------+---+
| table1.id | q.id | X |
+-----------+------+---+
|         1 |    1 | x |
|         2 |      |   |
+-----------+------+---+

Фактически возвращает:

+-----------+------+---+
| table1.id | q.id | X |
+-----------+------+---+
|         1 |    1 | x |
|         2 |      | x |
+-----------+------+---+
0 голосов
/ 11 апреля 2019

После подтверждения того, что мои предыдущие предложения не устраняют ошибку , вместо этого используют ошибку для получения ожидаемых результатов:

SELECT *
FROM Table1 
  LEFT JOIN 
    (SELECT TableX.x, Iif(TableX.x Is Null, Null, "P") AS PColumn 
     FROM TableX INNER JOIN TableY 
        ON TableX.x = TableY.y) AS Table2 
  ON (Table1.x = Table2.x)
WHERE Table1.X > 2

Если Аллен Браун правоптимизатор запросов Access выполняет вычисляемое поле (т. е. статическое значение) ПОСЛЕ соединения, поэтому просто заставьте поле учитывать наличие обычно ненулевого значения для воспроизведения правильных результатов внешнего соединения (т. е. левого соединения).

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