这是我正在使用的数据库:https://drive.google.com/file/d/1ArJekOQpal0JFIr1h3NXYcFVngnCNUxg/view?usp=sharing
查找标题中包含字符串'data'且至少有一位作者所在的论文 来自deptnum 100的部门。列出这些论文的panum和标题。您 必须使用EXISTS运算符。确保您的查询不区分大小写。
我不确定如何输出每位学者的论文总数。
我尝试这个问题:
SELECT panum, title
FROM department NATURAL JOIN paper
WHERE UPPER(title) LIKE ('%data%') AND EXISTS (SELECT deptnum FROM
department WHERE deptnum = 100);
这似乎是空洞的。我不确定我做错了什么,喜欢和EXISTS结合起来吗?
谢谢。
答案 0 :(得分:1)
不要使用natural join
!这是一种憎恶,因为它没有使用显式声明的外键关系。明确列出您的join
密钥,以便查询更易理解,更易于维护。
那就是说,你的子查询就是问题所在。我希望查询更像这样:
SELECT p.panum, p.title
FROM paper p
WHERE lower(p.title) LIKE '%data%' AND
EXISTS (SELECT 1
FROM authors
WHERE a.author = p.author AND -- or whatever the column should be
a.deptnum = 100
);
答案 1 :(得分:0)
由于他们需要EXISTS
,因此需要将运算符应用于author
,而不是department
表。 EXISTS
内的查询需要与论文查询相关联,因此顶级应该没有JOIN
:
SELECT p.PANUM, p.TITLE
FROM paper p
WHERE p.Title LIKE ('%data%') AND EXISTS (
SELECT *
FROM author a
JOIN academic ac ON ac.ACNUM=a.ACNUM
WHERE a.PANUM=p.PANUM AND ac.DEPTNUM=100
)
请注意,由于author
表缺少DEPTNUM
,因此您需要在EXISTS
查询中加入一个academic
行DEPTNUM
列。
答案 2 :(得分:0)
短语UPPER(title) LIKE ('%data%')
永远不会找到任何行,因为标题中任何内容的大写版本将永远不会包含小写字母data
。
答案 3 :(得分:0)
select p.TITLE,p.PANUM from PAPER p where TITLE like '%data%'
AND EXISTS(
SELECT * FROM AUTHOR a join ACADEMIC d
on d.ACNUM=a.ACNUM where d.DEPTNUM=100 AND a.PANUM=p.PANUM)