加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 在非关系数据库中创建视图

发布时间:2020-12-16 09:53:10 所属栏目: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位于字符串的开头和第一个星号之间.
> AuthorY周围有星号
> AuthorZ位于最后一个星号和字符串末尾之间.
> AuthorU独自一人,没有被任何东西包围.

因此,开头文件(下面的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读