从ORACLE DB获取数据

时间:2016-03-12 16:12:33

标签: sql database oracle

我有一个数据库,其中包含Author(id,name),AuthorPublication(aid,pid),Publication(id,title)

Author.id链接到AuthorPublication.aid,AuthorPublication.pid链接到Publication.od。

我正在尝试编写一个查询,该查询返回与“amol”或“samuel”共同撰写的作者的姓名,但不是两者兼而有之。

到目前为止我已经

Select name 
From Author, AuthorPublication, Publication
Where Publication.id = PID AND aid = Author.id 

在上面的代码中,我需要将PID过滤为pid与作者“samuel”或“amol”匹配的作者。但不是两个

作为oracle db的新手,我不太确定如何实现这个,任何帮助?

提前致谢!

2 个答案:

答案 0 :(得分:1)

在你的where子句中尝试:and (author.name = 'samuel' and author.name != 'amol') OR (author.name != 'samuel' and author.name = 'amol')(根据https://community.oracle.com/thread/2342467?tstart=0)。

答案 1 :(得分:1)

逻辑?基本上,获取两位作者的ID,获取他们的出版物的任何pid,这些pid可以是相同的....然后使用生成的出版物ID。在一个查询中有几种方法可以执行此操作,这里使用表别名在一个查询中多次使用表的方法:

select auth_sam.name as sams_name
      ,auth_amol.name as amols_name
      ,nvl(auth_sam.name, auth_amol.name) as single_author_name
      ,s_pubinfo.title as sam_publication_titles
      ,a_pubinfo.title as amol_publication_titles
      ,nvl(s_pubinfo.title, a_pubinfo.title) as single_pub_name
from author auth_sam
    ,authorPublication sam_pubs
    ,publication s_pubinfo -- 3 aliases for samuel data
    ,author auth_amol
    ,authorPublication amol_pubs
    ,publication a_pubinfo  -- 3 aliases for amol data
where auth_sam.name = 'samuel'
and auth_sam.id = sam_pubs.aid  -- pubs by samuel
and sam_pubs.pid = s_pubinfo.id  -- samuel titles
and auth_amol.name = 'amol'
and auth_amol.id = amol_pubs.aid  -- pubs by amol
and amol_pubs.pid = a_pubinfo.id  -- amol titles
and sam_pubs.pid != amol_pubs.pid  -- not the same publication

由于!=,查询有效地返回了2组结果。记录' samuel'将有' sams_name'填充的列和' amols_name'列将为null。记录' amol'将填充其名称列,并且samuel name列值将为null。由于这些空值,我使用NVL()包含两列来演示一种方法来选择要显示的作者字段值和标题字段值。 (这不是一个非常简洁的解决方案,但我认为它展示了关系逻辑和SQL的强大功能。)

btw - 在这个例子中,我真的认为使用Oracle SQL语法可以更好地读取SQL。包含所有JOINON关键字的ANSI SQL版本对我来说更难以阅读。