Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Неужели SQLite3 не поддерживает запросы с двойным (вложенным) INNER JOIN?

Некоторое время назад выяснилось, что в моем случае эффективнее писать RAW-запросы в Django, нежели использовать ORM: Как в Django через ORM сделать SQL-запрос с INNER JOIN?...

Теперь столкнулся с тем, что относительно простой вопрос вообще не хочет исполнятся. Запрос примерно таков:

SELECT TAB1.id, TAB2.id, TAB2.something, TABLINK1TO2.quantity
FROM TAB2
    INNER JOIN (TAB1
        INNER JOIN TABLINK1TO2
        ON TAB1.id = TABLINK1TO2.link4tab1_id)
    ON TAB2.id = TABLINK1TO2.link4tab2_id
WHERE TAB1.id=1
GROUP BY  TAB1.id, TAB2.id, TAB2.something, TABLINK1TO2.quantity;

raw-запрос возвращает:
<RawQuerySet: 'тут собственно посланный запрос'>

и обращение к его элементам вызывает ошибки и ругань на отсутствие полей в базе:
no such column: TAB1.id

Собственно исключение полей из запроса приводит к ругани на следующее поле... когда их не остается, то ругается на поля внутри INNER JOIN... В общем, не работает.

При этом, буквально упростив вопрос всего на один INNER JOIN:

SELECT TAB2.id, TAB2.something, TABLINK1TO2.quantity
FROM TAB2
    INNER JOIN TABLINK1TO2
    ON TAB2.id = TABLINK1TO2.link4tab2_id
WHERE TABLINK1TO2.link4tab1_id=1
GROUP BY  TAB2.id, TAB2.something, TABLINK1TO2.quantity;

И все начинает исправно фурыкать.

К сожалению мне нужен именно первый запрос, т.к. в TAB1 есть еще поля которые нужно получить (для простоты и читабельности они опущены). И такое впечатление, что ошибка именно на стороне SQLite3. Такое может быть? Или просто руки кривые?

Было бы отлично, если бы кто-то научил меня такие запросы строить через ORM, т.к. в этих таблицах немного данных и скорость не принципиальна. К сожалению в мануалах нет кейсов извлечения данных сразу из трех таблиц (двух основных и одной ManyToManyField, но в которой есть еще дополнительные атрибуты.

P.S. К сожалению проверить исполнение запроса через консоль SQLite3 не представляется возможным. Консоль SQLite3 не воспринимает работу Ctrl-Ins + Shiht-Ins (Ctrl-X + Ctrl-V), а набрать столь заковыристый SQL-запрос без ошибок нереально. Дело в том, что в реальном проекте таблицы и поля названы длинными и сложными именами, да еще к именам таблиц сам DJANGO добавил префикс из имени проекта... Только в конструкции FROM ... INNER JOIN (... INNER JOIN ... ON ....) ON ... что-то под 300 символов получается. Так что лучше не пытаться! :(

P.P.S. Совет пересесть на нормальную СУБД, вроде postgres. не подходит по причине того, что приходится кодить то на одной машине, то на другой. Перекинуть файл-базу SQLite3 через какой-нить dropbox проще простого и она одинаково подхватывается и из Windows и под Ubuntu...
  • Вопрос задан
  • 3902 просмотра
Решения вопроса 1
winordie
@winordie
Лучшая документация -- исходники
Такой запрос работает:
SELECT t1.id, t2.id, t2.something, t3.q
FROM t2 INNER JOIN t3 ON t2.id = t3.l2_id
        INNER JOIN t1 ON t1.id = t3.l1_id
WHERE t1.id=1
GROUP BY  t1.id, t2.id, t2.something, t3.q;

Значит с двойными join'ами работает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ошибка возникает из-за того, что в TAB1 нет поля id (согласно выводу ошибки no such column: TAB1.id). В рабочем запросе с одним INNER JOIN это поле (да и сама таблица) не фигурирует вообще.
Если лень вбивать запрос вручную, то можешь запустить скрипт из файла. На крайняк, всегда есть перенаправление потоков ввода/вывода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы