【问题标题】:ORDER BY clause won't work in table created with SELECT INTOORDER BY 子句在使用 SELECT INTO 创建的表中不起作用
【发布时间】:2014-05-10 16:50:38
【问题描述】:

您好,我对 SQL 还很陌生,并且一直在通过反复试验来学习,但我遇到了这个问题。我希望有人能给我一个建议。

1) 检查表是否已经存在于数据库中,如果确实删除了它[有效]

IF OBJECT_ID (N'PWC_L6_Daily',N'U') IS NOT NULL
DROP TABLE PWC_L6_Daily

2) 使用 SELECT INTO 语句从同一数据库中的原始表创建表,该语句中的 ORDER BY 子句可以正常工作,没有问题 DESC 或 ASC [工作]

SELECT Time_Stamp,Plate_Number,OP_Tgt_Wgt_Difference AS Sample_Tgt_Wgt_Difference,Plate_Weight_Target,Plate_Geometry,OP_NOP_Wgt_Difference
INTO PWC_L6_Daily
FROM PWC_L6 
WHERE ((Time_Stamp BETWEEN '05/09/2014 07:00:00' And '05/10/2014 06:59:59') AND (OP_Tgt_Wgt_Difference BETWEEN -6 And 6) AND (NOP_Tgt_Wgt_Difference BETWEEN -6 And 6) AND (Plate_Number <> 0) AND (Plate_Geometry <> 'Error'))
UNION ALL
SELECT Time_Stamp,Plate_Number,NOP_Tgt_Wgt_Difference AS Sample_Tgt_Wgt_Difference,Plate_Weight_Target,Plate_Geometry,OP_NOP_Wgt_Difference
FROM PWC_L6
WHERE ((Time_Stamp BETWEEN '05/09/2014 07:00:00' And '05/10/2014 06:59:59') AND (OP_Tgt_Wgt_Difference BETWEEN -6 And 6) AND (NOP_Tgt_Wgt_Difference BETWEEN -6 And 6) AND (Plate_Number <> 0) AND (Plate_Geometry <> 'Error'))
ORDER BY Time_Stamp ASC

3) 检查表是否已经存在于数据库中,如果确实删除了它[有效]

IF OBJECT_ID (N'PWC_L6_Report',N'U') IS NOT NULL
DROP TABLE PWC_L6_Report

4) 使用 SELECT INTO 语句从先前在同一数据库中使用 SELECT INTO 语句创建的表创建表,GROUP BY 子句将起作用,但它会给出随机顺序,ORDER BY 子句将不执行任何操作。 [不订购]

SELECT MAX(Time_Stamp) AS Last_Produced,Plate_Number,COUNT(Plate_Number) AS Sample_Count,AVG(Sample_Tgt_Wgt_Difference) AS Avg_StT_Wgt_Difference,AVG(OP_NOP_Wgt_Difference) AS Avg_StS_Wgt_Difference,STDEV(Sample_Tgt_Wgt_Difference) AS Std_Dev_StT_Wgt_Difference
INTO PWC_L6_Report
FROM PWC_L6_Daily
GROUP BY Plate_Number
ORDER BY Last_Produced DESC

5) 我进行了以下故障排除,发现如果我更改为 ASC 或 DESC,第一个 ORDER BY 子句(在第二步中)会影响 PWC_L6_Report 表,但此 SELECT INTO 语句中的第二个 ORDER BY 子句不会有任何完全没有效果。 [临时声明]

SELECT Time_Stamp
INTO PWC_L6_Report
FROM PWC_L6_Daily
ORDER BY Time_Stamp DESC

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

  • 您没有真正提出问题。但是猜测一下,您误解了表格以某种方式排序。他们不是。它们是无序的集合,任何时候你想要某种特定顺序的东西,你都必须明确地请求它。
  • @MarcB “mysql 本机格式”与标记为 sql-server-2012 的问题有什么关系?
  • @ta.speot.is: sigh...mybad.

标签: sql sql-server sql-server-2012


【解决方案1】:

如何判断数据是否按您想要的顺序排列?声明:

select *
from table t

将数据作为无序结果集返回。强制排序的唯一方法是使用order by。您确实在 SQL Server 中按插入顺序获取数据。这是符合 ANSI 的行为,并且与几乎所有数据库的工作方式一致。如果您希望结果按特定顺序排列,请使用order by

order by 可以用于insert,这是有充分理由的。如果你这样做:

insert into t2(col1 . . .)
    select col1 . . . )
    from t
    order by col1;

然后,identity 列将以正确的顺序递增。 (这是一个不错的功能,但可能会减慢插入速度。)您可以在查询中使用 row_number() 获得类似的效果:

SELECT row_number() over (order by Time_Stamp desc) as id, Time_Stamp
INTO PWC_L6_Report
FROM PWC_L6_Daily;

如果你愿意,现在你可以order by id 代替time_stamp

【讨论】:

    【解决方案2】:

    Order by 仅用于展示目的。用于插入数据时,无效。思维导图。

    【讨论】:

    • 实际上并非如此...... order by 可以影响到select part
    • 同意你们两个。配合 TOP 使用时也会生效。鉴于上下文,我认为这里没有使用 IDENTITY 或 TOP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2017-02-14
    相关资源
    最近更新 更多