我正在尝试创建一个物化视图,如下所示:
CREATE MATERIALIZED VIEW orders_mv AS
SELECT *
FROM (SELECT * FROM table1
UNION
SELECT * FROM table2
ORDER BY DBMS_RANDOM.VALUE)
WHERE rownum <= 5;但它给了我一个ORA-00600,并用常见的断开错误断开连接:
CREATE MATERIALIZED VIEW orders_mv
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 89299
Session ID: 11416 Serial number: 40331我们运行的是Oracle 12c。以这种方式创建物化视图和使用order by子句是否存在错误?
发布于 2021-11-15 02:17:16
这与物化视图无关。您是否尝试过在不创建视图的情况下单独运行select?这将是试图弄清楚到底发生了什么的第一步。
在具有集合操作(如UNION)的查询中,order by子句只能引用select列表中的列:按编号,或者如果显式列出了列,则按名称(如果使用别名,则按别名)。
具体地说,您不能对dbms_random.value这样的表达式执行order by。您甚至不允许按算术表达式(例如,字符串表达式等)排序。这仅取决于在select列表中特别指定的列。
因此:即使您命名了select列表中的所有列(而不是糟糕的select *实践),您也无法完成您尝试的操作。您仍然只能在select中按列排序-如果您尝试与set操作“在同一级别”进行排序。
相反,您将需要三个级别的select。在嵌套最深的子查询中,执行UNION,但不要尝试排序。在中间的select语句中,通过dbms_random.value对子查询的结果进行排序。并在外部查询中按rownum进行筛选。这也适用于select * (这只是一种糟糕的做法,但它是有效的)。
发布于 2021-11-15 07:49:49
您的问题可以在Windows上的Oracle版本18.4.0.0.0中重现(请注意,对于ORA-0600,这是相关信息)
....
No more data to read from socket正如在其他答案中诊断的那样,这是可行的:
CREATE MATERIALIZED VIEW orders_mv AS
SELECT *
FROM (SELECT DBMS_RANDOM.VALUE rnd, table1.* FROM table1
UNION
SELECT DBMS_RANDOM.VALUE rnd, table2.* FROM table2
ORDER BY 1)
WHERE rownum <= 5;https://stackoverflow.com/questions/69968665
复制相似问题