LINUX.ORG.RU

sqlite3 - соединить три таблицы


0

0

Всем привет.

Имеется три таблицы (A, B, C). A связана с B (A.b = B.id), B связана с C (B.c = C.id). Возникла необходимость взять значения из таблицы A, отфильтровав по данным из таблицы C. Думал - все просто:

SELECT a.id
FROM a INNER JOIN (b INNER JOIN c ON b.c = c.id) ON a.b = b.id
WHERE c.value = foo
Не тут то было:
SQL error: no such column: c.value
Если начать связывать с конца - то не найдет a.id.

Я конечно могу сделать связывание вручную - прописать все условия в WHERE. Но мне казалось, что идеологически более правильно организовывать связывание с помощью INNER JOIN. Никто не в курсе, это осуществимо в sqlite?

PS

sergey@Desktop:~/dev/pyPostIndex$ sqlite3 --version
3.6.22


1)

select a.id 
  from a, 
       b, 
       c
 where a.b = b.id
   and b.c = c.id
   and c.value = foo
2)
SELECT a.id 
  FROM a INNER JOIN (select b.id from b INNER JOIN c ON b.c = c.id where c.value = foo) b ON   a.b = b.id 

aydar ★★★★★
()

>Я конечно могу сделать связывание вручную - прописать все условия в WHERE. Но мне казалось, что идеологически более правильно организовывать связывание с помощью INNER JOIN

Не вижу никакой идеологической правильности в этом

aydar ★★★★★
()
Ответ на: комментарий от aydar

Ну то есть, получается, только ручками делать (полагаю, вариант с вложенным подзапросом не имеет смысла - все и так просто). Спасибо!

ksv
() автор топика
Ответ на: комментарий от ksv

>Ну то есть, получается, только ручками делать

оба запроса ручками написал, не пользуюсь построителями запросов

aydar ★★★★★
()
Ответ на: комментарий от aydar

>>Ну то есть, получается, только ручками делать

оба запроса ручками написал, не пользуюсь построителями запросов

Нет, я про связывание :) связывание таблиц «ручками» - через условия в where :) Сам тоже не пользуюсь построителями запросов - иначе бы и вопроса не возникло, полагаю.

ksv
() автор топика
Ответ на: комментарий от ksv

Ну это вроде стандартная конструкция? Я бы не додумался до приведенной в первом посте.

А вообще, см. http://savage.net.au/SQL/sql-92.bnf.html#joined%20table - это SQL92 и http://sqlite.org/syntaxdiagrams.html#join-source - это sqlite.

Если смотреть со стороны здравого смысла, то (<join-source>) - это определение отношения; если join идет на этот join source, то столбцы надо брать из этого же join-source'а, а не из таблиц, входящих в него. Если этот (<join-source>) как-то обозвать, то можно будет и делать join'ы к нему.

dmitry_vk ★★★
()
Ответ на: комментарий от aydar

> Не вижу никакой идеологической правильности в этом

Ман реляционная алгебра.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.