【问题标题】:&& Operator change the order of result [duplicate]&& 运算符更改结果的顺序 [重复]
【发布时间】:2023-03-20 21:23:01
【问题描述】:

为什么PostgreSQL 9.4 的&& 运算符用于检查两个数组的重叠,改变结果的顺序?

我有一个问题

Select *  FROM "View_Student_Plan" WHERE  "ClassID" && ARRAY[53]:: bigint[] 

我的视图按入学日期排序。 它工作正常,如果我使用

Select *  FROM "View_Student_Plan"

但是当我将剩余部分附加到查询中时,它会改变结果的顺序。

我在 where 子句中使用了一些其他条件,例如 Student_Name like 'P%',,那么它不会影响 select 语句给出的结果顺序。那为什么不"ClassID" && ARRAY[53]:: bigint[]

【问题讨论】:

  • 如果您需要特定的结果顺序,您应该在查询中添加ORDER BY 子句。您不应该指望没有明确顺序的查询或视图的顺序。
  • @macmoonshine 但是如果我运行 query select * from "view..." 那么它可以正常工作。
  • @Pooja-G 可能会,或者明天可能不会。这个错误的假设是如此强大,sqlite 甚至有一个编译指示来反转选择顺序,只是为了让这些错误重新出现。如果某样东西没有按规范排序,你就不能依赖它。
  • 这与 && 无关,与 VIEW 无关。
  • SQL Server 例如甚至不允许Order By 内部视图(除了与TOP 语句一起使用)

标签: sql postgresql


【解决方案1】:

在任何 RDBMS 中,默认情况下都不会设置输出的顺序,并且每次都可以进行不同的排序!它可以按索引、优化器、默认设置和 ETC 排序。

强制执行特定顺序的唯一方法(例如,按入学日期)是使用 ORDER BY 子句。

编辑:关于您的评论,VIEW 不能包含 ORDER BY 子句,因为该子句应该在 结束,因此无效的查询,否则,可以忽略。
例如

SELECT * FROM YourView
ORDER BY....--THIS WILL WORK

当它在视图中时:

SELECT * 
FROM (SELECT * FROM ....
      ORDER BY ..)

所以优化器可以随意忽略这一点。

【讨论】:

  • 我正在使用 order by。 “View_Student_Plan”是我的视图,该视图的查询包含 order by 子句。
  • @Pooja-G order by 需要在查询的最后,否则会被忽略。
  • 但是如果我运行 query select * from "view..." 那么它可以正常工作。@Magnus
  • @Pooja-G 我已经添加了一些解释
  • @Pooja-G:查询优化器使用了许多不同的策略来提高性能,但其中一些(例如,将记录放入临时哈希表中)会完全改变排序。保证订单的唯一方法是在最终查询中输入ORDER BY。如果您想知道优化器在做什么,请运行EXPLAIN SELECT * FROM ...
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 2023-04-03
  • 2013-07-30
  • 1970-01-01
  • 2022-01-19
  • 2019-09-28
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多