繁体   English   中英

ORACLE SQL - 更改表顺序

[英]ORACLE SQL - ALTER TABLE ORDER BY

我有一个包含两列“COL_A”和“COL_B”的表,我通过一次插入一行来创建:

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

我想在程序结束时让表按 COL_A 排序。 我认为这可以通过在填写表格后运行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 中使用 ORACLE SQL。

在 SQL 中,表格表示无序集。 您只能在查询数据时对表进行排序:

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

如果您担心性能,您可以在(col_a)上添加一个索引——因此使用索引而不是实际排序。

注意:缺乏排序也适用于视图。 如果你想要一个有序的结果集,你需要在查询中使用order by

你在谈论两个不同的事情:

1.如果你想在你的 PROC_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,因此您不需要每次都建立连接。

2.运行 DDL 语句。 没有像 ALTER TABLE xxxx 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 连接的用户授予读取权限。

希望它澄清。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM