asp.net – 在非关系数据库中创建视图
我有一个问题,我希望有人可以帮助我.事实上,我在一个设计糟糕的数据库上工作,我无法控制其中的内容.我有一个表“书籍”,每本书可以有一个或多个作者.不幸的是,数据库并不是完全关系的(请不要问我为什么,因为我从一开始就问同样的问题).在“书籍”表中有一个名为“Author_ID”和“Author_Name”的字段,因此当一本书由2或3位作者撰写时,他们的ID和他们的名字将在由星号分隔的同一记录中连接.这是一个演示:
ID_BOOK | ID_AUTHOR | NAME AUTHOR | Adress | Country | ---------------------------------------------------------------------------------- 001 |01 | AuthorU | AdrU | CtryU | ---------------------------------------------------------------------------------- 002 |02*03*04 | AuthorX*AuthorY*AuthorZ | AdrX*NULL*AdrZ | NULL*NULL*CtryZ | ---------------------------------------------------------------------------------- 我需要为这个表创建一个视图,它会给我这个结果: ID_BOOK | ID_AUTHOR | NAME AUTHOR | Adress | Country | ---------------------------------------------------------------------------------- 001 |01 | AuthorU | AdrU | CtryU | ---------------------------------------------------------------------------------- 002 |02 | AuthorX | AdrX | NULL | ---------------------------------------------------------------------------------- 002 |03 | AuthorY | NULL | NULL | ---------------------------------------------------------------------------------- 002 |04 | AuthorZ | AdrZ | CtryZ | ---------------------------------------------------------------------------------- 我将继续尝试这样做,我希望有人可以帮助我至少提供一些提示.非常感谢你们. 在我应用你们给出的解决方案后,我遇到了这个问题.我想解决它,希望你能帮助我.实际上,当sql查询运行时,CLOB字段在其中一些包含NULL值时是无组织的. reslut应该像上面一样,但我得到了以下结果: ID_BOOK | ID_AUTHOR | NAME AUTHOR | Adress | Country | ---------------------------------------------------------------------------------- 001 |01 | AuthorU | AdrU | CtryU | ---------------------------------------------------------------------------------- 002 |02 | AuthorX | AdrX | CtryZ | ---------------------------------------------------------------------------------- 002 |03 | AuthorY | AdrZ | NULL | ---------------------------------------------------------------------------------- 002 |04 | AuthorZ | NULL | NULL | ---------------------------------------------------------------------------------- 为什么将NULL值放在最后?谢谢. 解决方法
几周前我回答了一个类似的问题
here.那个答案有一个解释(我希望)的一般方法,所以我将跳过这里的解释.这个查询可以解决问题;它使用REGEXP_REPLACE并利用其“occurrence”参数来选择单个作者ID和名称:
SELECT ID_Book,REGEXP_SUBSTR(ID_Author,'[^*]+',1,Counter) AS AuthID,REGEXP_SUBSTR(Name_Author,Counter) AS AuthName FROM Books CROSS JOIN ( SELECT LEVEL Counter FROM DUAL CONNECT BY LEVEL <= ( SELECT MAX(REGEXP_COUNT(ID_Author,'[^*]+')) FROM Books)) WHERE REGEXP_SUBSTR(Name_Author,Counter) IS NOT NULL ORDER BY 1,2 有一个小提琴你的数据加上另一行here. 附录:OP有Oracle 9,而不是11,所以正则表达式不起作用.以下是没有正则表达式执行相同任务的说明… 没有REGEXP_COUNT,计数作者的最佳方法是计算星号并添加一个星号.要计算星号,取字符串的长度,然后在所有星号被吸出时减去其长度:LENGTH(ID_Author) – LENGTH(REPLACE(ID_Author,’*’)). 如果没有REGEX_SUBSTR,则需要使用INSTR来查找星号的位置,然后使用SUBSTR来提取作者ID和名称.这有点复杂 – 请考虑原始帖子中的这些作者列: Author U Author X*Author Y*Author Z > AuthorX位于字符串的开头和第一个星号之间. 因此,开头文件(下面的WITH AuthorInfo AS …)在开头和结尾添加一个星号,因此每个作者姓名(和ID)都用星号包围.它还会抓取每一行的作者计数.对于原始帖子中的示例数据,开头文章将产生以下结果: ID_Book AuthCount ID_Author Name_Author ------- --------- ---------- ------------------------- 001 1 *01* *AuthorU* 002 3 *02*03*04* *AuthorX*AuthorY*AuthorZ* 然后加入“计数器”表和SUBSTR诡计来提取个人姓名和ID.最终查询如下所示: WITH AuthorInfo AS ( SELECT ID_Book,LENGTH(ID_Author) - LENGTH(REPLACE(ID_Author,'*')) + 1 AS AuthCount,'*' || ID_Author || '*' AS ID_Author,'*' || Name_Author || '*' AS Name_Author FROM Books ) SELECT ID_Book,SUBSTR(ID_Author,INSTR(ID_Author,'*',Counter) + 1,Counter+1) - INSTR(ID_Author,Counter) - 1) AS AuthID,SUBSTR(Name_Author,INSTR(Name_Author,Counter+1) - INSTR(Name_Author,Counter) - 1) AS AuthName FROM AuthorInfo CROSS JOIN ( SELECT LEVEL Counter FROM DUAL CONNECT BY LEVEL <= (SELECT MAX(AuthCount) FROM AuthorInfo)) WHERE AuthCount >= Counter ORDER BY ID_Book,Counter 小提琴是here (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Angular 2中的组件是什么
- entity-framework – 带有INT id列的MVC 6的ASP.Net标识
- .net – 什么是dnu换行?
- CompTIA PK0-003 认证
- asp.net core系列 43 Web应用 Session分布式存储(in memory
- Asp.net Response.Write在ascx / aspx文件中
- asp.net-mvc – ConfigurationManager读取错误的文件 – We
- asp.net-mvc – ASP.NET MVC Javascript ActionResult
- asp.net-mvc – 实时ASP.NET MVC Web应用程序
- 为什么工作线程使我的ASP.NET生成器在睡眠期间遇到ThreadAb
- asp.net-mvc – DDay iCal – 添加一个与会者
- asp.net-mvc – Web部署由于文件正在使用而失败
- asp.net – 如何在web.config中指定根(/)位置?
- 我是否需要在asp.net中取消订阅(手动订阅)活动?
- asp.net通过kerberos集成windows身份验证到sql s
- BreezeJS vs JayData for ASP开发ASP.NET MVC
- asp.net-mvc – 当我的一个模型属性是整数时,为什
- System.Net.ServicePointManager.DefaultConnect
- asp.net – 在web.config中创建一个字符串并在we
- 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的示例