SQL Server ORDER BY子句在使用SELECT INTO创建的表中无效

nvbavucw  于 2023-01-08  发布在  其他
关注(0)|答案(3)|浏览(228)

你好,我是一个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子句将不起任何作用。[不执行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子句(在第2步中)会影响PWC_L6_Report表,但此SELECT INTO语句中的第二个ORDER BY子句根本不起任何作用。[临时语句]

SELECT Time_Stamp
INTO PWC_L6_Report
FROM PWC_L6_Daily
ORDER BY Time_Stamp DESC

我真的很感激你的建议谢谢。

s2j5cfk0

s2j5cfk01#

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

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

mrphzbgm

mrphzbgm2#

排序依据仅用于显示目的。当用于插入数据时,它不起作用。将表格视为集合。

ejk8hzay

ejk8hzay3#

我看到的不同之处在于,在第2步中,您在order by语句中使用的变量(Time_Stamp)是表中的一个现有列;而在第4步中,您使用的变量(Last_Produced)不是表中的一个现有列--您仍在创建该列的过程中。
在查询4中,如果您使用order by max(Time_Stamp),那么我认为应该可以工作。
另外,我注意到如果您在SAS环境中使用“proc sql and create table query”,那么在变量名创建过程中按顺序使用变量名是有效的。这可能与SAS/SQL处理/保存数据的方式有关。

相关问题