Sql 对于相同但较小的SELECT查询,大型SELECT查询似乎返回不同的顺序?

Sql 对于相同但较小的SELECT查询,大型SELECT查询似乎返回不同的顺序?,sql,sqlite,Sql,Sqlite,我正在执行SQLite查询,以获取一组图像ID的所有图像路径。需要维护ID的顺序。如果查询5个ID,将按正确顺序返回5个路径。但是,如果我保持查询完全相同,但查询72000个ID,那么我收到的返回顺序会不同吗 为什么会这样?我已经复制并粘贴了2个查询和2个结果(显然减去完整的72000个ID和结果) 这对任何人都有意义吗 查询(带有5个ID) 结果(这是正确的!) 查询(有72000个ID) 结果(这是不正确的!为什么订单会更改? 编辑:您将如何对这两个查询进行联接? "~/ImagesPath

我正在执行SQLite查询,以获取一组图像ID的所有图像路径。需要维护ID的顺序。如果查询5个ID,将按正确顺序返回5个路径。但是,如果我保持查询完全相同,但查询72000个ID,那么我收到的返回顺序会不同吗

为什么会这样?我已经复制并粘贴了2个查询和2个结果(显然减去完整的72000个ID和结果)

这对任何人都有意义吗

查询(带有5个ID)

结果(这是正确的!)

查询(有72000个ID)

结果(这是不正确的!为什么订单会更改?

编辑:您将如何对这两个查询进行联接?

"~/ImagesPath/36/20160818_050623_000.jpg"
"~/ImagesPath/36/20160818_050710_000.jpg"
"~/ImagesPath/36/20160818_050844_000.jpg"
"~/ImagesPath/36/20160818_050449_000.jpg"
"~/ImagesPath/36/20160818_050757_000.jpg"
etc... to 72,000
SELECT MicrosoftId FROM TagsMSCV WHERE name IN ('" + some vars + "') GROUP BY MicrosoftId ORDER BY COUNT(MicrosoftId) DESC


如果没有显式指定一个
orderby
子句,则无法保证返回行的顺序。数据库可以自由地以最有效的顺序返回它们。即使您碰巧按照您想要的顺序得到了结果,您也不能指望它-任何情况下(例如,重建索引,或者只是某个缓存上的一行)都可能在下次运行查询时更改顺序

TL;DR,如果您关心行的顺序,则应添加一个
orderby
子句:

SELECT   Path 
FROM     Images
WHERE    MicrosoftId IN ('78003','78010','78080','78149','78196', /* etc ...*/)
ORDER BY MicrosoftId

一种解决方案是将查询组织成一个
连接

select * from
    (
        select 78003 as mid
        union select 78010
        union select 78080
        union select 78149
        union select 78196
        # and so on...
    ) mids
    inner join Images on (Images.MicrosoftId = mids.mid);
这样,查询应该使用构造的
mids
表的顺序

如果您想对排序有额外的把握,可以在构造的表上附加一个排序列:

select * from
    (
        select 78003 as mid, 1 as midOrder
        union select 78010, 2
        union select 78080, 3
        union select 78149, 4
        union select 78196, 5
        # and so on...
    ) mids
    inner join Images on (Images.MicrosoftId = mids.mid)
    order by midOrder

这个连接应该会起作用

我不确定为什么查询中没有
orderby
子句。是否有具体原因?订单依据位于此之前的查询中。这与那个家伙在数据库中设置表的方式有关。我必须用ID做所有的事情,一旦我有了ID,我需要使用它们来获得我需要的路径。但是我获取ID的顺序很重要;我需要维护它。我需要的顺序就是查询的顺序。我必须在一个不同的表中找到ID的来源,然后我来到这个表来获得它们相应的路径。实现这一点的唯一方法是将两个独立的SQL语句结合起来吗?连接可能是最好的方法-它应该简化代码并可能使其更高效。这实际上将一堵代码墙变成了一行代码。我真的需要升级我的SQL游戏。非常感谢。现在要弄清楚这一切是如何运作的,哈哈。
SELECT Path FROM Images WHERE MicrosoftId IN ('" + results from above query + "')
SELECT   Path 
FROM     Images
WHERE    MicrosoftId IN ('78003','78010','78080','78149','78196', /* etc ...*/)
ORDER BY MicrosoftId
select * from
    (
        select 78003 as mid
        union select 78010
        union select 78080
        union select 78149
        union select 78196
        # and so on...
    ) mids
    inner join Images on (Images.MicrosoftId = mids.mid);
select * from
    (
        select 78003 as mid, 1 as midOrder
        union select 78010, 2
        union select 78080, 3
        union select 78149, 4
        union select 78196, 5
        # and so on...
    ) mids
    inner join Images on (Images.MicrosoftId = mids.mid)
    order by midOrder
SELECT Path FROM Images i
JOIN TagsMSCV t ON i.MicrosoftId = t.MicrosoftId
WHERE t.name IN ('" + some vars + "') GROUP BY t.MicrosoftId ORDER BY
COUNT(t.MicrosoftId) DESC