Sql &&;运算符更改结果的顺序
为什么PostgreSQL 9.4的&&运算符用于检查两个数组的重叠,更改结果的顺序 我有一个问题Sql &&;运算符更改结果的顺序,sql,postgresql,Sql,Postgresql,为什么PostgreSQL 9.4的&&运算符用于检查两个数组的重叠,更改结果的顺序 我有一个问题 Select * FROM "View_Student_Plan" WHERE "ClassID" && ARRAY[53]:: bigint[] 我的观点是按入学日期排序的。 如果我用的话,效果很好 Select * FROM "View_Student_Plan" 但当我附加查询的剩余部分时,它会改变结果的顺序 我在where子句中使用了一些其他条件,如Studen
Select * FROM "View_Student_Plan" WHERE "ClassID" && ARRAY[53]:: bigint[]
我的观点是按入学日期排序的。
如果我用的话,效果很好
Select * FROM "View_Student_Plan"
但当我附加查询的剩余部分时,它会改变结果的顺序
我在where子句中使用了一些其他条件,如
Student\u Name,如'p%',
,这样它就不会影响select语句给出的结果顺序。那么,对于“ClassID”和&ARRAY[53]::bigint[]
在任何RDBMS中,输出的顺序都不是默认设置的,每次都可以按不同的顺序排序!它可以按索引、优化器、默认设置等进行排序
强制执行特定订单的唯一方法(例如,通过入院日期)是使用orderby
子句
编辑:关于您的评论,视图
不能包含ORDER BY
子句,该子句无效,因为该子句应位于查询的末尾,否则可以忽略。
例如
SELECT * FROM YourView
ORDER BY....--THIS WILL WORK
当它位于视图内部时,它类似于:
SELECT *
FROM (SELECT * FROM ....
ORDER BY ..)
因此,优化器可以随意忽略这一点。在任何RDBMS中,默认情况下都不会设置输出顺序,并且每次都可以进行不同的排序!它可以按索引、优化器、默认设置等进行排序 强制执行特定订单的唯一方法(例如,通过入院日期)是使用
orderby
子句
编辑:关于您的评论,视图
不能包含ORDER BY
子句,该子句无效,因为该子句应位于查询的末尾,否则可以忽略。
例如
SELECT * FROM YourView
ORDER BY....--THIS WILL WORK
当它位于视图内部时,它类似于:
SELECT *
FROM (SELECT * FROM ....
ORDER BY ..)
因此,优化器可以忽略这一点。如果您需要结果的特定顺序,您应该在查询中添加一个
orderby
子句。您不应该依赖于没有明确顺序的查询或视图的顺序。@macmoonshine,但如果我从“视图…”运行查询选择*,它就会正常工作。@Pooja-G它可能会,或者明天它可能不会。这种错误的假设非常强烈,sqlite甚至有一个pragma来反转选择顺序,只是为了让这些错误重新出现。如果某个内容未按规范排序,则无法依赖于该内容进行排序。这与&&无关,而与视图有关。例如,如果您需要结果的特定顺序,SQL Server甚至不允许按内部视图进行排序(与TOP
语句结合使用除外),您应该在查询中添加一个orderby
子句。您不应该依赖于没有明确顺序的查询或视图的顺序。@macmoonshine,但如果我从“视图…”运行查询选择*,它就会正常工作。@Pooja-G它可能会,或者明天它可能不会。这种错误的假设非常强烈,sqlite甚至有一个pragma来反转选择顺序,只是为了让这些错误重新出现。如果某项内容未按规范排序,则不能依赖于它进行排序。这与&&无关,与视图有关。例如,SQL Server甚至不允许内部视图中的Order by
(除了与TOP
语句结合使用)我使用的是Order by。“查看学生计划”是我的视图,该视图的查询包含order by子句。@Pooja-Gorder by
需要位于查询的最后,否则它将被忽略。但是如果我运行查询,请从“查看…”中选择*然后它就正常工作了@Magnus@Pooja-我加了一些explanation@Pooja-G:查询优化程序使用了许多不同的策略来提高性能,但其中一些(例如,将记录放入临时哈希表)将完全改变顺序。保证订单的唯一方法是在最终查询中输入一个orderby
。如果您想知道Optimizer在做什么,请运行EXPLAIN SELECT*FROM…
。我使用的是order by。“查看学生计划”是我的视图,该视图的查询包含order by子句。@Pooja-Gorder by
需要位于查询的最后,否则它将被忽略。但是如果我运行查询,请从“查看…”中选择*然后它就正常工作了@Magnus@Pooja-我加了一些explanation@Pooja-G:查询优化程序使用了许多不同的策略来提高性能,但其中一些(例如,将记录放入临时哈希表)将完全改变顺序。保证订单的唯一方法是在最终查询中输入一个orderby
。如果您想知道优化器在做什么,请运行EXPLAIN SELECT*FROM…
。