结合LIKE和EXISTS?

时间:2018-05-16 01:57:20

标签: mysql sql sql-like exists

这是我正在使用的数据库: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结合起来吗?

谢谢。

4 个答案:

答案 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查询中加入一个academicDEPTNUM列。

答案 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)