表现表:
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;
答案 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)。