SQLite在使用子查询时说“没有这样的列:rowid”
下面是一个运行良好的查询:SQLite在使用子查询时说“没有这样的列:rowid”,sqlite,Sqlite,下面是一个运行良好的查询: 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_
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
这是一个bug,还是对rowid使用的设计限制?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
是否可以尝试在子查询中别名rowid?如下所示:从消息m2中选择m2.rowid作为match_rowid,其中x像“%abc%”@GuZzie Whoa。。。在子查询中对其使用别名没有帮助,但仅将外部的别名(如m1.rowid)修复了它!太好了我很高兴听到您解决了这个问题我猜您在外部查询中必须使用别名的原因是,在这种情况下,ROWID是不明确的-它可能引用m1中的一列,或者子查询结果中的一列。但是在子查询中,没有这样的歧义。如果这就是原因,那么错误消息是误导性的,正如您所想。出于某种原因-请参阅我上面的评论,
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