2016-03-05 3 views
1

Я застрял в простом объединении в SQLite.Предложение INNER JOIN не возвращает строк, в то время как NATURAL JOIN делает

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

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

Нормальный присоединиться запрос работает OK и возвращает хорошие результаты (результаты):

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

'«REL_References_Pages.ReferenceID»' 'должны быть«REL_References_Pages»«идентификаторСсылки»' –

ответ

2

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

Проще говоря, под командой дало бы false булево выход:

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

Try без кавычек вокруг всей 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 
+0

Большое спасибо. Я думал, что конструкция TableName.Column является монолитной. Ввод данных в «Ссылки» .ReferenceID исправил все. Спасибо за другие два комментария. Раньше я их пробовал, но поскольку выбор не работал должным образом, я был озадачен, в чем проблема. – mrmut

+0

Я добавил объяснение того, что на самом деле произошло, когда вы выполнили свой запрос. –

+0

Большое спасибо. Я потратил несколько часов на это, пытаясь понять это. – mrmut