2015-04-21 33 views
2

如果没有sortgroup by语句,我想知道PROC SQL返回数据的顺序。它总是一样吗?PROC返回的行的顺序SQL

例如,假设我这样做:

proc sql; 
    create table cusips as 
     select a.cusip as c1, b.cusip as c2 
     from shrs a, shrs b; 
quit; 

这只是给了我两个CUSIP变量的每个组合的列表。这些顺序是否与原始输入数据相同?它看起来像我的情况,但我想知道如果我能确定这将永远是真实的。

+2

SQL中的表和结果集(不同于SAS)表示*无序*集。除非您指定'by by'子句,否则不能依赖结果集中值的排序。 –

回答

2

PROC SQL不保证在任何情况下的相同顺序。 一般来说,如果你正在从一张表中做一个简单的选择,它可能会按照数据已经存在的顺序返回,这主要是因为没有这样做更多的工作。

然而,PROC SQL如果决定它是最佳的话,会做的事情一样分割的数据分割成块,并分别平行处理它们 - 并不像它应该可能,但它有时会不过。这经常发生在join,特别是因为它可以做为散列连接,在这种情况下,您可以按照一个表格的顺序或两者兼而有之,或笛卡尔产品或其他一些选项。

特别是,在上面的连接中,SQL优化器可能选择将其作为笛卡尔积,作为散列连接,作为索引连接或其他几种方法。他们每个人都可能会导致不同的结果。即使在这种情况下,如果连接是由多个线程完成的,线程可能会根据当时执行的服务器/计算机的条件而有所不同(例如,如果一个CPU处于更多/更少的负载下来自其他进程,可能会获得更少/更多的数据)。

因此,你永远不应该依赖它将数据返回到顺序 - 总是要求它按顺序返回。

这也是为什么monotonic()函数不建议用于生产代码的原因(因为如果最终订单不同于原始订单,它可能不会始终返回预期值)。

如果您正在寻找以原始订单取回数据并且不知道原始订单或不想指定完整订单,一个很好的解决方法是使用datastep视图来获取原始订单。 Datastep视图将按顺序处理数据。

data myview/view=myview; 
    set mydata; 
    _ordervar+1; 
run; 

proc sql; 
    select * from myview 
    order by _ordervar; 
quit;