SQLite говорит «нет такого столбца: rowid» при использовании подзапросов - PullRequest
3 голосов
/ 30 декабря 2011

Вот запрос, который отлично работает:

SELECT rowid as msg_rowid, a, b, c FROM messages m1

А вот еще один, который тоже хорошо:

SELECT rowid as match_rowid FROM messages m2 WHERE x LIKE '%abc%'

Но если я соберу их вместе следующим образом, SQLite будет жаловаться:

SELECT rowid as msg_rowid, a, b, c FROM messages m1
JOIN
    (SELECT rowid as match_rowid FROM messages m2 WHERE x LIKE '%abc%')
ON
    msg_rowid >= match_rowid - 10 AND msg_rowid <= match_rowid + 5

с сообщением, которое выглядит как вводящее в заблуждение сообщение об ошибке: No such column: rowid.

Как я могу это исправить?

Запрос выполняется нормально, если я использую поле messages.timestampвместо rowid:

SELECT timestamp as msg_ts, a, b, c FROM messages m1
JOIN
    (SELECT timestamp as match_ts FROM messages m2 WHERE x LIKE '%abc%')
ON
    msg_ts >= match_ts - 10 AND msg_ts <= match_ts + 5

Это ошибка или ограничение на использование rowid?

1 Ответ

8 голосов
/ 09 января 2012

Ответил GuZzie в комментарии.По какой-то причине SQLite требует от меня явного указания внешнего идентификатора строки:

SELECT m1.rowid as msg_rowid, a, b, c FROM messages m1
       ^^ HERE
JOIN
    (SELECT rowid as match_rowid FROM messages m2 WHERE x LIKE '%abc%')
ON
    msg_rowid >= match_rowid - 10 AND msg_rowid <= match_rowid + 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...