我有一个数据库,其中包含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的新手,我不太确定如何实现这个,任何帮助?
提前致谢!
答案 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。包含所有JOIN
和ON
关键字的ANSI SQL版本对我来说更难以阅读。