我想要来自给定数据库的电影名称

时间:2015-08-04 10:45:28

标签: sql oracle11g

表现表:

   PerformanceId    SingerId    MovieId     NumberofSongs


   1                1           1           2
   2                3           1           4
   3                2           2           6
   4                4           5           3
   5                5           5           3
   6                2           6           2
   7                4           6           5
   8                6           4           6
   9                6           3           3
   10               4           3           4

歌手表:

    SingerId    SingerName    City           DOB          Gender

    1           A             Hyderabad      14-Apr-65    M
    2           B             Chennai        25-May-84    M
    3           C             Bangalore      14-Sep-78    F
    4           D             Hyderabad      17-Jan-70    M
    5           E             Hyderabad      18-Mar-87    F
    6           F             Bangalore      23-Aug-75    F

电影桌:

    MovieId     MovieName      ReleaseDate

    1           AAA            12-Jan-15
    2           BBB            19-Sep-12
    3           CCC            23-Jul-10
    4           DDD            06-Oct-01
    5           EEE            08-Nov-05
    6           FFF            18-Apr-99
    7           GGG            07-Aug-12

我需要列出MovieId,MovieName,其中包括男歌手和女歌手 (列出movieid,moviename,其中男性和女性歌手,即两位歌手都在一部电影中演出)

大家好,请帮我解决这个问题我试过,我没有得到确切的查询

这是我的疑问:

   select * from movies a inner join performance b 
   on  a.movie_id=b.movie_id where b.singer_id in 
  (select singer_id from singer where  gender = 'F') c inner join
  (SELECT SINGER_ID FROM SINGER WHERE gender = 'M') d
  on c.singer_id=d.singer_id;

2 个答案:

答案 0 :(得分:1)

首先创建一个视图" MOVIE_ANALYSIS"您将获得所有电影的列表,以及他们是否混合歌手:

public void ShowToastWithCloudService(bool useCustomSound, bool useWavFormat, bool doSilentToast)
{
    StringBuilder toastMessage = new StringBuilder();
    toastMessage.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?><wp:Notification xmlns:wp=\"WPNotification\"><wp:Toast>");
    toastMessage.Append("<wp:Text1>Toast Title</wp:Text1>");
    toastMessage.Append("<wp:Text2>Toast Content</wp:Text2>");
    if ((IsTargetedVersion) && (useCustomSound))
    {
        if (useWavFormat)
        {
            toastMessage.Append("<wp:Sound>MyToastSound.wav</wp:Sound>");
        }
        else
        {
            toastMessage.Append("<wp:Sound>MyToastSound.mp3</wp:Sound>");
        }
    }
    else if ((IsTargetedVersion) && (doSilentToast))
    {
        toastMessage.Append("<wp:Sound Silent=\"true\"/>");
    }
    toastMessage.Append("</wp:Toast></wp:Notification>");
}

然后,您将通过此查询获得最终结果:

CREATE VIEW MOVIE_ANALYSIS AS SELECT
  M.MOVIEID ,
  M.MOVIENAME, 
  (COUNT(DISTINCT S.GENDER) > 1) AS MIXED
FROM MOVIE M
INNER JOIN PERFORMANCE P ON P.MOVIEID = M.MOVIEID 
INNER JOIN SINGER S ON S.SINGERID  = P.SINGERID
GROUP BY M.MOVIEID ;

我使用中间视图的原因是在几个SQL引擎中,你不能使用计算的&#34;混合&#34;直接在同一个查询中使用group by属性。它会坚持要求混合色谱柱丢失。

验证并测试H2。我没有在Oracle上测试,因为我无法访问它。

答案 1 :(得分:0)

这里你想要的是INTERSECT语句(使用Oracle):

select movieId
  from performance a
 where exists (select 1 
                 from singer b 
                where A.singerID = b.singerID 
                  and b.gender = 'F')
intersect 
select movieId
  from performance a
 where exists (select 1 
                 from singer b 
                where A.singerID = b.singerID 
                  and b.gender = 'M');

然后你只需加入你回到电影表的电影ID。

INTERSECT只会返回两个查询共有的ID(或者您使用的许多ID)。