Apache Drill: предоставление ограничения в подзапросе для бокового соединения не возвращает правильные результаты - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать простой запрос с inner lateral join, но я хочу ограничить объединение одним результатом в подзапросе

select b.`CODE`
from foo.bar.`BRANCH` b
inner join lateral (
   select branch_id
   from foo.bar.`BRANCH_DISTANCE`
   where branch_id=b.CODE
   and distance < 100
   limit 1
) on true

Таблица BRANCH_DISTANCE содержит расстояния между любыми двумя ветвями, и я хочу вернуть все ветви, которые находятся в пределах 100 km другой ветки, поэтому в подзапросе, если есть одна запись, которая содержит ветвь и его расстояние меньше 100, оно должно вернуть ответвление (и прекратить поиск дальнейших совпадений).

Но когда я добавляю ограничение, запрос возвращает только одну запись. При снятии лимита возвращается около 2000 записей.

Если я заменим select b.CODE на select distinct b.CODE, получится около 500 результатов (это правильный ответ).

Моя цель состоит в том, чтобы не использовать ключевое слово distinct в операторе выбора, и поэтому я добавил ограничение в подзапросе, чтобы объединение выполнялось не для каждой записи в таблице BRANCH_DISTANCE, содержащей ветвь код и расстояние <100 (поскольку ветвь может быть на расстоянии менее 100 км от более чем одной ветки). </p>

1 Ответ

0 голосов
/ 18 июня 2019

Соединение может умножить количество результирующих строк для случая, когда объединение происходит в столбце с повторяющимися значениями (в этом или оба столбца branch_id и b.CODE имеют повторяющиеся значения).

Чтобы ограничитьприсоединиться к одному результату в подзапросе, пожалуйста, используйте предложение IN.Так что-то вроде этого должно работать как положено:

select b.`CODE`
from foo.bar.`BRANCH` b
where b.`CODE` in (
   select branch_id
   from foo.bar.`BRANCH_DISTANCE`
   and distance < 100
)
...