sar*_*lil 3 database-agnostic count
我创建了两个不同的表,然后决定将它们(=)放在一起,但是,我感到困惑的是是否允许这样使用(=)。我尝试使用 IN 但我也不知道从那里去哪里。我的做法正确吗?
\n考虑一个用于存储与电影相关的信息的关系模式:\nActorMovie(a_name, a_YofB, m_title, m_year)\nMovie(title,year,genre,budget,cost,gross_earnings)
\n问:列出所有出演过相同数量的喜剧和悲剧的演员的名字。
\nCreate View V1 AS (\nSelect name\n From ActorMovie a, Movie m\nWhere a.m_title = m.title AND a.m_year = m. year AND Genre = \xe2\x80\x98Comedy\xe2\x80\x99)\n\nCreate View V2 (\nSelect name\n From ActorMovie a, Movie m\nWhere a.m_title = m.title AND a.m_year = m. year AND Genre = \n\xe2\x80\x98Tragedies\xe2\x80\x99)\n\nSelect COUNT (name) = (Select Count (name) FROM V2)\nFrom V1 \n
Run Code Online (Sandbox Code Playgroud)\n
问:列出所有出演过相同数量的喜剧和悲剧的演员的名字。
您可以通过几种不同的方式通过单个查询来完成此操作,无需创建视图。一种方法是使用 CTE,如下所示:
WITH ActorMovieGenreCounts AS
(
SELECT
a.name AS ActorName,
m.genre AS MovieGenre,
COUNT(*) AS MovieCount
FROM ActorMovie a
INNER JOIN Movie m
ON a.m_title = m.title
AND a.m_year = m. yea
WHERE m.genre IN ('Comedy', 'Tragedy')
GROUP BY a.name, m.genre
)
SELECT AMGC1.ActorName
FROM ActorMovieGenreCounts AS AMGC1
INNER JOIN ActorMovieGenreCounts AS AMGC2
ON AMGC1.ActorName = AMGC2.ActorName -- Same Actor
AND AMGC1.MovieGenre <> AMGC2.MovieGenre -- Different Genre (one is Comedy the other is Tragedies)
WHERE AMGC1.MovieCount = AMGC2.MovieCount -- Same Movie Count between those Genres
Run Code Online (Sandbox Code Playgroud)
情侣备注:
该查询的工作原理是首先对演员和电影数据进行分组,以获取每个演员出演的电影数量,然后仅过滤到Comedy
和Tragedies
类型。然后,对于同一演员,但流派不同(即一个是 ,Comedy
另一个是Tragedies
),它将这些结果与其自身连接起来,将该演员的每种流派的电影计数放在同一行。最后,它过滤掉那些计数不同的行,因此只留下该演员“出演了相同数量的喜剧和悲剧”的行。
请注意使用JOIN
s 而不是您所使用的逗号语法,该语法已过时。通常,您应该使用JOIN
语法将表关联在一起,以提高可读性。
正如一开始所指出的,您不需要创建此类特定的视图对象来解决此问题。像上面这样的单个临时查询就可以解决这个问题。
一般来说,您应该标记您正在使用的特定数据库系统和版本,因为并非所有功能和语法都相同。