【问题标题】:SQL check top 100 rows different everytime running the SQL query?每次运行 SQL 查询时,SQL 检查前 100 行不同?
【发布时间】:2014-05-09 19:52:01
【问题描述】:

我是 SQL 新手。

我使用“order by”在 SQL、IBM 的 netezza 上对两个大表进行排序。

表格是:

 col1  INT
 col2  INT
 col3  INT
 col4  DOUBLE PRECISION

 INSERT INTO mytable
 SELECT * 
 FROM table1 AS t1
 ORDER BY t1.col1 , t1.col2, t1.col3, t1.col4 ASC

排序后,我检查前100行:

SELECT *
FROM mytable
LIMIT 100;

但是,每次对前 100 行运行 SQL 查询时,我都会得到不同的结果。

当我将表格导出到 txt 文件时,同样的事情。

为什么?

谢谢!

【问题讨论】:

  • 您应该使用适当的标签。 netezza 不是 sql server。

标签: sql sql-server database sql-server-2008 netezza


【解决方案1】:

向表中插入数据的顺序是没有意义的。运行查询绝对不能保证返回的顺序行,除非您使用order by 子句明确指定它。由于无法保证行的顺序,因此无法保证“前 100 名”是什么,因此每次运行查询时可能会得到不同的结果。

但是,如果您确实在查询中指定了顺序,则应该得到一致的结果(假设前 100 行只有一种可能的结果,而不是例如 200 行,其中任何 100 行都可以被视为有效结果):

SELECT   *
FROM     mytable
ORDER BY col1, col2, col3, col4 ASC
LIMIT    100;

【讨论】:

    【解决方案2】:

    虽然可能与插入数据的顺序相匹配,但不能保证顺序。如果您需要按特定顺序使用它,请使用 ORDER BY。

    【讨论】:

      【解决方案3】:

      您需要对 select 查询使用 order by,并且在 order by 子句之后显式编写 ASC 不是强制性的,因为默认情况下将按升序排序

      SELECT *
      FROM mytable t1
      ORDER BY t1.col1 , t1.col2, t1.col3, t1.col4 
      LIMIT 100;
      

      【讨论】:

      • 为了清楚起见,我个人更喜欢写出 ASC。
      • @SpectralGhost 实际上 Mureinik 写它的方式更不清楚。他仅将ASC 显式应用于col4,并将其隐含在col1, col2, col3 上。为了清晰起见保持一致性
      【解决方案4】:

      您需要将order by 应用于您的Select 声明

      【讨论】:

        【解决方案5】:

        ORDER BY 也属于 SELECT 查询:

        SELECT *
        FROM mytable t1
        ORDER BY t1.col1 , t1.col2, t1.col3, t1.col4 ASC
        LIMIT 100;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-25
          • 2015-10-17
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多