«Нет предиката присоединения» без псевдонима - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть две таблицы.Таблица A:

enter image description here

Таблица B:

enter image description here

Также у меня естьфункция, которая возвращает табличное значение (1 и 3).

get_customer_id:

enter image description here

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

SELECT ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = ID)

и сообщение «Нет предиката соединения» в плане запроса.Хотя я ожидал увидеть только записи с ID = 1 и 3.

Я знаю, что проблему можно решить двумя способами.

1)

SELECT A.ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = A.ID)

2)

SELECT ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE ID IN (select ID from get_customer_id())

Но я не могу понять, почему, если я не указываю псевдоним, он не возвращает то, что я ожидал, получается, что условие не выполняется?Почему я вижу предупреждение, только с точки зрения запроса, почему эта проблема не попадает в ошибку? Буду благодарен за любые ответы и рекомендации.Я не могу найти точное объяснение в Интернете ...

1 Ответ

0 голосов
/ 23 сентября 2018

Вы думаете, что этот подзапрос:

 WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = ID)

интерпретируется как:

WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = A.ID)

Это желаемое за действительное.Правила определения объема в SQL начинаются с ближайшего FROM.Так что это действительно интерпретируется как:

WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = GCI.ID)

Таким образом, в принципе не существует «предиката соединения».

Именно поэтому вы должны всегда указывать имена столбцов.Кстати, вам не нужно выбирать ID, вы можете выбрать что угодно.Я бы обычно писал это как:

WHERE EXISTS (select 1 from get_customer_id() gci gci.ID = a.ID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...