以下是我使用的数据库:https://drive.google.com/file/d/1ArJekOQpal0JFIr1h3NXYcFVngnCNUxg/view?usp=sharing
select distinct
AC1.givename, AC1.famname, AC2.givename, AC2.famname
from
academic AC1, author AU1, academic AC2, author AU2
where
AC1.acnum = AU1.acnum
and AC2.acnum = AU2.acnum
and AU1.panum = AU2.panum
and AU2.acnum > AU1.acnum
and not exists (select *
from Interest I1, Interest I2
where I1.acnum = AC1.acnum
and I2.acnum = AC2.acnum);
输出:
我无法用外行术语解释子查询和查询的输出(普通英语)。
不确定我的解释是否正确:
"子查询找到感兴趣的字段,其中两位作者没有共同感兴趣的领域。
整个查询查找至少有两位作者的论文作者的名字和姓氏,并且没有共同感兴趣的领域。"
答案 0 :(得分:0)
目前看,如果每个学者至少有一个兴趣,子查询将产生行。
总的来说,这个问题是“产生一对学者,他们共同撰写了至少一篇论文,其中至少有一篇论文没有任何兴趣”。很难相信这就是意图,如果是这样的话,有更清晰的写作方式可以更清楚地表明这就是我们正在寻找的目标。
如果这是我们想要的查询,我会把它写成:
SELECT
AC1.givename, AC1.famname, AC2.givename, AC2.famname
FROM
academic AC1
inner join
academic AC2
on
AC1.acnum < AC2.acnum
WHERE EXISTS
(select * from author au1 inner join author au2 on au1.panum = au2.panum
where au1.acnum = ac1.acnum and au2.acnum = ac2.acnum)
AND
(
NOT EXISTS (select * from interest i where i.acnum = ac1.acnum)
OR
NOT EXISTS (select * from interest i where i.acnum = ac2.acnum)
)
如果我们更有可能想要那些没有兴趣共同的共同作者,我们会写下这样的内容:
SELECT
AC1.givename, AC1.famname, AC2.givename, AC2.famname
FROM
academic AC1
inner join
academic AC2
on
AC1.acnum < AC2.acnum
WHERE EXISTS
(select * from author au1 inner join author au2 on au1.panum = au2.panum
where au1.acnum = ac1.acnum and au2.acnum = ac2.acnum)
AND NOT EXISTS
(select * from interest i1 inner join interest i2 on i1.field = i2.field
where i1.acnum = ac1.acnum and i2.acnum = ac2.acnum)
请注意我的查询都不使用distinct
,因为我们确保外部查询不是加入其他行,我们只关心存在<这些行的/ em>或缺席 - 我们已将所有此类检查移至EXISTS
子查询中。
我通常会在作者获得多个结果的时候经常看到distinct
,因为他们只想要一个结果并且他们不愿意花费精力去发现为什么他们'得到多个结果。在这种情况下,可能会出现同一批学者共同撰写不止一篇论文的情况。