2011-12-30 11 views
2

を使用してここで正常に動作クエリです:SQLiteのは、「そのような列を:ROWID」と言うんサブクエリ

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

そしてここでも大丈夫です別の一つだ:

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

しかし、私は置けば一緒に次のように、SQLiteは文句:No such column: rowid

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 

は、誤解を招くようなエラーメッセージがどのように見えるかを与えます。

どうすればこの問題を解決できますか?

私が代わりにROWIDのmessages.timestampフィールドを使用している場合、クエリは正常に動作します:

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の使用にすることにより、設計制約ですか?

+3

サブクエリのROWIDをエイリアスしようとしますか? このように:m_rowidとしてのmatch_rowidからのメッセージm2 WHERE x LIKE '%abc%' – GuZzie

+1

@GuZzie Whoa ... *サブクエリでのエイリアシングは助けになりませんが、エイリアシング*ちょうど外側のものとして'm1.rowid'は修正しました! –

+0

素晴らしい!あなたが問題を修正したことを聞いてうれしく思います。 – GuZzie

答えて

7

GuZzieによってコメントが回答されました。何らかの理由でSQLiteは私に外側のROWIDについて明示的に要求します:

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 
+2

「何らかの理由で」 - 上記のコメントを参照してください。http://stackoverflow.com/questions/8682398/sqlite-says-no-such-column-rowid-when-using-sub-queries#comment68721434_8682398 – LarsH

関連する問題