我想知道在SQL Oracle中是否可以进行一些范围定义(例如在Excel中)。 例如:
[TABLE0] [WHERE / GROUP BY / HAVING / ORDER BY / ...];从[SCHEMA]中定义TABLE1 =选择FIELD1,FIELD2,FIELD3。
DEFINE TABLE2 =从TABLE1中选择字段1,字段2,字段3 [WHERE / GROUP BY / HAVING / ORDER BY / ...];
DEFINE TABLE3 =在[CONDITIONS]上从TABLE2左联接TABLE1中选择FIELD1,FIELD2,FIELD3;
SELECT * FROM TABLE3;
非常感谢。
您是否考虑过公用表表达式(WITH子句)?
@Steve,我仅了解以下逻辑:"使用TABLE1 AS [表结构],TABLE2 AS [表结构] SELECT * FROM TABLE1 JOIN TABLE2;" & 而已。 我不确定这个子句后面是否还有更复杂的逻辑...
仅用您发布的抽象数据来给出有意义的示例有点困难,但是附带条款可以包含任何类型的选择查询(包括对group-by和where子句的使用)。 逻辑可以像您需要的那样复杂-您还可以链接表引用,因此一个CTE的内容可以引用一个较早的版本(即,在您的示例中TABLE2可以从TABLE1中进行选择或加入) 在附带条款中定义)。
根据您的示例,听起来您想创建视图:
CREATE VIEW TABLE1 AS
SELECT FIELD1, FIELD2, FIELD3
FROM [SCHEMA].[TABLE0][WHERE/GROUP BY/HAVING/...];
CREATE VIEW TABLE2 AS
SELECT FIELD1, FIELD2, FIELD3
FROM TABLE1 [WHERE/GROUP BY/HAVING/...];
CREATE VIEW TABLE3 AS
SELECT FIELD1, FIELD2, FIELD3
FROM TABLE2
LEFT JOIN TABLE1 ON [CONDITIONS];
SELECT * FROM TABLE3;
但您不会(我希望)实际调用视图table1,table2或table3。命名视图更常见,以便您知道它们是视图。例如TABLE0_V1,TABLE0_V2,TABLE0_V3和从不在视图定义中包括ORDER BY
@Used:...就像我不会调用任何一个表一样。但就您的观点而言,我知道通常会看到以某种方式添加前缀或后缀的视图来标识它们。就个人而言,我认为没有必要。但我绝对同意您不希望在视图定义中使用ORDER BY。编辑。
很高兴我们同意不使用视图中的顺序。 IMHO的命名约定也很重要,尤其是对于那些不熟悉数据模型的人,但是有关命名约定的辩论通常是徒劳的:)
@Used_By_Already-为什么"从不在视图定义中包括ORDER BY"?怎么了
显然,这是不相关的(根据AskTom,在这里:asktom.oracle.com/pls/apex/),因为(引用)"在优化查询之前,它经历了一个称为"转换"的阶段,在该阶段我们(Oracle)寻找重新编写查询的方式,这可能会在不改变SQL目的的情况下为优化提供更多选择。因此,如果优化程序发现未使用ORDER BY视图(或被SELECT自己的ORDER BY覆盖),则查询将被转换,而ORDER BY被忽略。
我认为重要的是不要以TABLE开始视图名称;)
@littlefoot尽管优化器有可能忽略未使用的订单,但大多数情况下,优化器只是不这样做,因此在解释计划中可以看到无关订单的成本。根本没有很好的理由来定义视图中的顺序。排序应仅留给最终查询。
嗨@sstan,非常感谢,这可能会有所帮助。 ||只有一个问题:您知道只能使用" SELECT"特权才能完成的任何其他方式吗?我要修改的数据库是生产模式,因此除视图外我没有其他功能。
如果您仅具有SELECT特权,则最好的办法是使用WITH子句,该子句类似于定义视图,但只能在定义了WITH子句的同一查询中重用。
结束这个问题。 从其中一个注释(Steve)中,我需要一个WITH子句,因为我没有DDL特权。
谢谢,