使用SQL比较两个计数结果

使用SQL比较两个计数结果,sql,oracle,Sql,Oracle,我的数据库考试真的需要帮助。 我有一个电影数据库,我必须列出每一个比文森特·卡塞尔拍得更多电影的演员。 我的模式是 CREATE TABLE "ACTOR" ( "codactor" NUMBER(*,0), "name" VARCHAR2(50 BYTE), "surname" VARCHAR2(50 BYTE), "country" VARCHAR2(50 BYTE) ) SEGMENT CREATION IMMEDIATE CR

我的数据库考试真的需要帮助。 我有一个电影数据库,我必须列出每一个比文森特·卡塞尔拍得更多电影的演员。 我的模式是

CREATE TABLE "ACTOR" 
   (    
    "codactor" NUMBER(*,0), 
    "name" VARCHAR2(50 BYTE), 
    "surname" VARCHAR2(50 BYTE), 
    "country" VARCHAR2(50 BYTE)
   ) SEGMENT CREATION IMMEDIATE 
CREATE TABLE "FILM" 
   (    
    "CODFILM" NUMBER(*,0), 
    "title" VARCHAR2(100 BYTE), 
    "GENERE" VARCHAR2(50 BYTE), 
    "duration" NUMBER(*,0), 
    "year" NUMBER(*,0), 
    "earnings" FLOAT(63), 
    "valutation" NUMBER(2,1)
   ) SEGMENT CREATION IMMEDIATE 
CREATE TABLE "Plays" 
   (    
    "CODFILM" NUMBER(*,0), 
    "codactor" NUMBER(*,0), 
    "role" VARCHAR2(300 BYTE), 
    "income" FLOAT(63)
   ) SEGMENT CREATION IMMEDIATE 
考虑到这一点,我不知道如何计算文森特·卡塞尔拍了多少部电影,然后将结果与每个演员拍的电影数量进行比较,只选择比文森特·卡塞尔拍得更多的演员。
感谢大家的帮助。

这将为您提供文森特·卡塞尔主演的多部电影:

select A.codactor, COUNT(P.codfilm) HowManyMovies
from Plays P join Actor A
on P.codactor = A.codactor
where A.name = 'Vincent Cassel'
group by A.codactor

这将给你带来比《文森特·卡塞尔》更多电影的演员

SELECT A.name ,A.surname,count(*) HowManyMovies
FROM Plays P
INNER JOIN Actor A
ON P.codactor = A.codactor
GROUP BY A.name ,A.surname
HAVING count(*) > (
    SELECT COUNT(P.codfilm) HowManyMovies
    FROM Plays P
    INNER JOIN Actor A
        ON P.codactor = A.codactor
    WHERE A.name = 'Vincent Cassel'
    GROUP BY A.codactor
    )

首先,让我们计算一下每个演员在电影中的主演次数

然后,让我们只选择这些演员,他们的戏剧数量高于文森特·卡塞尔的最大数量(这是为了在数据库中有多个文森特·卡塞尔的情况下正确处理)。包括
coalesce()
让我们来处理一个没有剧本或演员不在我们的表中的情况

with act_plays as (
select a."codactor", a."name", a."surname", count(*) as playcount
from "ACTOR" a
inner join "Plays" p on
  a."codactor" = p."codactor"
group by a."codactor", a."name", a."surname"
)
select *
from act_plays
where playcount > coalesce(( 
  select max(playcount) -- if more than one Vincent Cassel let's take max val
  from act_plays
  where "name" =  'Vincent' and "surname" = 'Cassel'
  ), 0)

在组合演员和戏剧时,我们可以安全地使用
内部联接
,因为我们需要比文森特·卡塞尔主演更多电影的演员,因此,如果文森特的值为0,我们将丢弃那些没有主演任何电影的演员。

我已经删除了所有不同的dbms标记。将其中一个放回原处,即实际使用的dbms。添加一些示例表数据和预期结果-所有内容都是格式化文本,而不是图像。并向我们展示您当前的查询尝试。Oracle SyntxIt将列名强制为非标准大小写似乎不是一个好的做法。现在您有了
ACTOR.codactor
(列名强制小写),但有了“FILM.CODFILM”(不区分大小写)和
“Plays.CODFILM
(表名强制大小写混合,列名不区分大小写)。工作真的很痛苦。你现在真的在参加考试吗?