Предложение 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