使用 select 语句和序列创建视图

Posted

技术标签:

【中文标题】使用 select 语句和序列创建视图【英文标题】:Create a view with a select statement and a sequence 【发布时间】:2012-12-13 05:06:18 【问题描述】:

我创建了一个带有 select 语句的视图,但我需要添加一个新字段 USER_ID,它显示了随每条记录递增的序列 (USER_ID_SEQ)。是否可以?我知道您可以使用 UNION 创建带有两个选择语句的视图,但我不确定如何将序列添加到视图中。 下面是我用于第一个 SELECT 语句的查询。

create or replace view FINAL_WEB_LOG
as
SELECT SESSION_DT, 
     C_IP, 
     CS_USER_AGENT,
     tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS
FROM web_views_tab    
GROUP BY C_IP, CS_USER_AGENT, SESSION_DT

【问题讨论】:

【参考方案1】:

尝试在select 中使用嵌套查询:

  create or replace view FINAL_WEB_LOG
  as
  SELECT (SELECT USER_ID_SEQ.NEXTVAL from dual) as USER_ID,
     SESSION_DT, 
     C_IP, 
     CS_USER_AGENT,
     tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS
 FROM web_views_tab    
 GROUP BY C_IP, CS_USER_AGENT, SESSION_DT

这应该可以,但我相信USER_ID_SEQ.NEXTVAL 会在每次刷新视图时不断增加。

如果您只想关联一个 ID 字段,那么只需使用 ROWNUM 作为:

  create or replace view FINAL_WEB_LOG
  as
  SELECT ROWNUM as USER_ID,
     SESSION_DT, 
     C_IP, 
     CS_USER_AGENT,
     tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS
 FROM web_views_tab    
 GROUP BY C_IP, CS_USER_AGENT, SESSION_DT

【讨论】:

SQL Server 有一个 ROWCOUNT() 函数——我假设 oracle 有类似的东西。这对你有用吗? 谢谢,但显然序列号在这种陈述中是不合适的。用表格代替会容易得多,但 COLLECT 函数在涉及 VIEW 时可以正常工作。 @DaleM 你的意思是ROWNUM Dale M - 我不确定这是否适用于 VIEW,但我会调查一下!谢谢。 如果您想对生成的“序列”编号的“顺序”进行更多控制,row_number() 可能是更好的选择。

以上是关于使用 select 语句和序列创建视图的主要内容,如果未能解决你的问题,请参考以下文章

10-02视图的创建

视图和使用 SELECT INTO 创建的表之间的主要区别?

视图序列索引的创建及用户权限

创建mysql视图时是不是应该在SELECT语句中引用多个表?

JAVA-Unit05: 视图序列索引 约束

sqlserver创建视图