SQL 从视图中的 4 个表中选择

Posted

技术标签:

【中文标题】SQL 从视图中的 4 个表中选择【英文标题】:SQL select from 4 tables in a view 【发布时间】:2020-05-21 17:35:50 【问题描述】:

这就是问题所在,我有这 4 个表:

书籍

  idbook ISBN   title   sinopse   pages  lang   code   year  edition  idedit
     1    EC2   somet     thing      34    ES     Ec2   2011     1       1
     2    EC3    more    things     545    ES     Ec4   2012     2       2
     3    EC4    lots   ofthing     323    EN     Uk1   2014     1       1

社论

idedit     name      country          web
     1     Pearson      USA        www.pearson.com
     2     Pretince     UK         www.pretince.com

作者

idaut      name       country     bio
  1        George       USA       lorem ipsum
  2         Jeff        UK        dolor sit amet

作者

 idbook       idaut       order
  1             1           2   
  2             2           5
  3             1           7

所以,我需要一个仅显示与 ES lang 匹配的元素的视图,按年份排序。对于您需要显示的每本书:年份、书名、ISBN、版本、社论名称和作者姓名。 编辑名称和订单没有问题,但我不知道如何获得作者的姓名。 Authory 是位于书籍​​和作者中间的表格。 到目前为止,这是我的代码:

create view `INFORMATICS` as
(select l.year, l.title, l.isbn, l.edition, e.name 
from books l
inner join  editorial e on e.idedit=l.idedit
where lang = 'ES'
)

到目前为止的选择是好的,但是如何添加作者姓名?像一个名字 要获得这样的表格:

year    title   ISBN    edition   editorial_name    author_name
2011   somet    EC2       1          Pearson           George
2012    more    EC3       2          Pretince          Jeff 

【问题讨论】:

没有人需要视图 :-( 【参考方案1】:

尝试以下操作,您必须加入 authorybooks 以获取作者 ID idaut,然后加入 authoryauthor 以获取作者姓名。

create view `INFORMATICS` as
(select 
    l.year, 
    l.title, 
    l.isbn, 
    l.edition, 
    e.name, 
    a.name 
from books l
inner join  editorial e 
on e.idedit=l.idedit
inner join  authory ar 
on l.idbook=ar.idbook

inner join  author a
on ar.idaut=a.idaut

where lang = 'ES'
order by l.year
)

【讨论】:

非常感谢,这就是我想的三重内连接,效果很好【参考方案2】:

你可以像普通桌子一样使用它

但是您需要在视图中添加另一列,那就是 idbook

create view `INFORMATICS` as
(select l.idbook ,l.year, l.title, l.isbn, l.edition, e.name 
from books l
inner join  editorial e on e.idedit=l.idedit
where lang = 'ES'
)

然后是 SELECT 和 INNER JOIN

 SELECT * FROM INFORMATICS i 
    INNER  JOIN  authory au 
      ON i.idbook=au.idbook
    INNER JOIN  author a    
      ON au.idaut=a.idaut 
 WHERE a.name ='Arthur';

正如草莓正确指出的那样 views 有一些限制,包括无法使用索引,所以会像直接做一样慢

【讨论】:

请注意,这(可能)不能使用索引

以上是关于SQL 从视图中的 4 个表中选择的主要内容,如果未能解决你的问题,请参考以下文章

如何从sql中的四个表中进行选择?

SQL 从 N 个表中选择唯一的外键

SQL 服务器。从2个表中选择数据[重复]

sql 从表中选择未出现在第二个表中的所有内容

从每组中的 3 个表中选择 sql 中具有最新日期的行

SQL Server:根据来自其他 2 个表的子查询从表中选择