SQL/ORACLE查询练习18c
按字母顺序显示1980年至1985年间每年至少演过一部电影的演员SQL/ORACLE查询练习18c,sql,oracle,Sql,Oracle,按字母顺序显示1980年至1985年间每年至少演过一部电影的演员 电影(CODFILM,TITLE,YEAR,流派)——YEAR是数字,它只包含年份 演员(配角、姓名、姓氏、国籍) 演员阵容(配角、配角、补偿) 我不确定这个解决方案,有人能检查一下吗 SELECT * FROM ACTOR WHERE CODACTOR IN ( SELECT CODACTOR FROM FILM NATURAL JOIN CAST WHERE YEAR = 1980 AND YEAR = 1981 AND
- 电影(CODFILM,TITLE,YEAR,流派)——YEAR是数字,它只包含年份
- 演员(配角、姓名、姓氏、国籍)
- 演员阵容(配角、配角、补偿)
SELECT *
FROM ACTOR
WHERE CODACTOR IN (
SELECT CODACTOR
FROM FILM NATURAL JOIN CAST
WHERE YEAR = 1980 AND YEAR = 1981 AND YEAR = 1982 AND YEAR = 1983 AND YEAR = 1984 AND YEAR = 1985)
ORDER BY COGNOME;
我认为的另一个解决方案是(更改子查询中的位置):
必须联接所有表,按参与者分组,并在having子句中设置条件:
SELECT a.CODACTOR, a.SURNAME, a.NAME
FROM ACTOR a
INNER JOIN CAST c ON c.CODACTOR = a.CODACTOR
INNER JOIN FILM f ON f.CODFILM = c.CODFILM
WHERE f.YEAR BETWEEN 1980 AND 1985
GROUP BY a.CODACTOR, a.NAME, a.SURNAME
HAVING COUNT(DISTINCT f.YEAR) = 1985 - 1980 + 1
ORDER BY a.SURNAME, a.NAME
谢谢有时我用JOIN。连接和内部连接有什么区别?Just JOIN与内部连接相同。@Uomolepre,而
JOIN
和Internal JOIN
是相同的(因此这取决于开发人员的偏好)。我仍然指定内部
,以便快速区分内部
、左侧
、右侧
、完整
,以及(非常、非常、很少)交叉连接。有关更多信息,请查看选择文档。好的,我会的,谢谢你的建议
SELECT a.CODACTOR, a.SURNAME, a.NAME
FROM ACTOR a
INNER JOIN CAST c ON c.CODACTOR = a.CODACTOR
INNER JOIN FILM f ON f.CODFILM = c.CODFILM
WHERE f.YEAR BETWEEN 1980 AND 1985
GROUP BY a.CODACTOR, a.NAME, a.SURNAME
HAVING COUNT(DISTINCT f.YEAR) = 1985 - 1980 + 1
ORDER BY a.SURNAME, a.NAME