[英]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.