如何编写一个 SQL 查询,其中 2 个不同属性的计数相同?

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

问:列出所有出演过相同数量的喜剧和悲剧的演员的名字。

\n
Create 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

J.D*_*.D. 6

问:列出所有出演过相同数量的喜剧和悲剧的演员的名字。

您可以通过几种不同的方式通过单个查询来完成此操作,无需创建视图。一种方法是使用 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)

情侣备注:

  1. 该查询的工作原理是首先对演员和电影数据进行分组,以获取每个演员出演的电影数量,然后仅过滤到ComedyTragedies类型。然后,对于同一演员,但流派不同(即一个是 ,Comedy另一个是Tragedies),它将这些结果与其自身连接起来,将该演员的每种流派的电影计数放在同一行。最后,它过滤掉那些计数不同的行,因此只留下该演员“出演了相同数量的喜剧和悲剧”的行。

  2. 请注意使用JOINs 而不是您所使用的逗号语法,该语法已过时。通常,您应该使用JOIN语法将表关联在一起,以提高可读性。

  3. 正如一开始所指出的,您不需要创建此类特定的视图对象来解决此问题。像上面这样的单个临时查询就可以解决这个问题。

  4. 一般来说,您应该标记您正在使用的特定数据库系统和版本,因为并非所有功能和语法都相同。