oracle sql-alter table order by

gc0ot86w  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(431)

我有一个表,有两列“col\u a”和“col\u b”,我通过一次插入一行来创建:

COL_A       COL_B
20200330    49
20200413    31
20200420    19
20200511    99
20190318    73
20190401    86

我想在节目结束时请a列订购这张table。我想通过运行一个 ALTER TABLE 命令后,我填写了表格,所以我尝试:

PROC SQL;
     CONNECT TO ORACLE (USER=XXX ORAPW=XXX PATH=XXX);
          EXECUTE (
                ALTER TABLE SCHEMA.TABLE 
                ORDER BY COL_A

    ) BY ORACLE;
    DISCONNECT FROM ORACLE;
QUIT;

但我明白了

ERROR: ORACLE execute error: ORA-01735: opción ALTER TABLE no válida.

当然,我可以用col_a排序的这个原始表的数据创建另一个表,但是我想知道我是否可以就地创建它。
我在sas中使用oraclesql。

p8ekf7hl

p8ekf7hl1#

在sql中,表表示无序的集合。查询数据时只能对表进行排序:

select t.*
from schema.table t
order by t.col_a;

如果您关心性能,可以在上添加索引 (col_a) --因此使用索引而不是实际排序。
注意:对于视图,缺少顺序也是如此。如果你想要一个有序的结果集,你需要使用 order by 在查询中。

ego6inou

ego6inou2#

你说的是两件不同的事:
1.如果要在proc\u sql进程中对结果进行排序

proc sql;
         CONNECT TO ORACLE (USER=XXX ORAPW=XXX PATH=XXX);
              EXECUTE (
                    SELECT * FROM SCHEMA.TABLE 
                    ORDER BY COL_A

        ) BY ORACLE;
        DISCONNECT FROM ORACLE;
    quit;

顺便说一下,您可能希望在sas中使用libname来连接到oracle,因此不需要每次都构建connect。
2.运行ddl语句。不存在alter table x order by这样的事情。为了在oracle中对列进行排序,您有索引。

proc sql;
  CONNECT TO ORACLE (USER=XXX ORAPW=XXX PATH=XXX);
  execute(CREATE INDEX SCHEMA.YOUR_INDEX_NAME ( COL_A ) on SCHEMA.TABLE ) BY ORACLE;
quit;

但是,我认为使用sas运行ddl语句是一种非常糟糕的做法。如果要对结果排序,只需对查询排序。此外,运行ddl语句要求通过sas连接的用户被授予正确的特权,这在世界上任何公司都是不可能的。请记住,您使用sas是为了进行分析,因此dba通常只向通过sas连接的用户授予读取权限。
希望能澄清。

mqkwyuun

mqkwyuun3#

您可以简单地像下面所示的示例一样,参考https://www.oracletutorial.com/oracle-basics/oracle-order-by 了解其中的变化。

SELECT
    name,
    address,
    credit_limit
FROM
    customers
ORDER BY
    name ASC;

相关问题