Предложение INNER JOIN не возвращает строк, в то время как NATURAL JOIN делает

Я застрял с простым соединением в SQLite.

У меня есть две таблицы - одна с данными, другая реляционная с указателями:

  • References содержит ReferenceID а также Reference
  • REL_References_Pages содержит ReferenceID а также PageID

Обычный запрос на соединение работает нормально и возвращает хорошие результаты:

SELECT Reference
FROM "References" 
NATURAL JOIN REL_References_Pages
WHERE PageID = 6

Но если я попытаюсь сделать явное JOIN, результат будет без ошибки, но не вернет результат. Где он застрял, находится в предложении ON:

SELECT Reference
FROM "References" 
JOIN REL_References_Pages ON "REL_References_Pages.ReferenceID" = "References.ReferenceID"
WHERE PageID = 6

Есть идеи?

Я мог бы просто использовать NATURAL JOIN, но мне интересно, почему обычное соединение не работает.

Также стол References имеет глупое имя, но это то, что есть.

1 ответ

Решение

Я считаю, что причина того, что вы получаете пустой вывод (без строк), заключается в том, что в предложении on вы пытаетесь сравнить две строки, которые не равны, и, таким образом, возвращаете false,

Проще говоря, команда ниже даст false логический вывод:

SELECT "REL_References_Pages.ReferenceID" = "References.ReferenceID"

Попробуйте без кавычек вокруг всего table.column построить там, где это не нужно. Только в вашем случае References Таблица изначально инкапсулирована в модель данных. По крайней мере, я предполагаю это.

SELECT Reference
FROM "References" 
JOIN REL_References_Pages
  ON REL_References_Pages.ReferenceID = "References".ReferenceID
WHERE PageID = 6

Или еще лучше с использованием псевдонимов:

SELECT Reference
FROM "References" AS r 
JOIN REL_References_Pages AS rp
  ON r.ReferenceID = rp.ReferenceID
WHERE PageID = 6

Вы также можете сократить код, применив USING вместо выражения, поскольку имена ваших столбцов в обеих таблицах одинаковы, и вам вообще не нужно назначать псевдонимы таблицам в вашем запросе:

SELECT Reference
FROM "References"
JOIN REL_References_Pages USING ( ReferenceID )
WHERE PageID = 6
Другие вопросы по тегам