比较两个不同的行根据一列

比较两个不同的行根据一列

问题描述:

实施例的数据集:比较两个不同的行根据一列

enter image description here

我有3分不同的列

  1. FilmAdi(FilmName),
  2. OyuncuAdi(ActorName)
  3. OyuncuSoyadı (演员姓名)

如果用户输入两个不同的演员姓名,例如

OyuncuAdi='Şener', OyuncuSoyadı='Şen' and OyuncuAdi='Kemal',OyuncuSurname='Sunal' 

如果有什么电影在一起播放,请获得电影名称。 示例输出如下。

'Tosun Paşa' 

编辑:我解决了问题后,太多的尝试,这个查询解决方案,它是我心中

select f.FilmAdi 
from Oyuncular o 
join FilmOyuncular fo on fo.OyuncuId=o.OyuncuId 
join Filmler f on f.FilmId=fo.FilmId 
where o.OyuncuId in('4','5') --Oyuncu.OyuncuID 4 ve 5 olan oyuncuların oynadıkları filmler 
group by f.FilmAdi 
having COUNT(f.FilmId)>1 
+2

这里的大多数人想要格式化文本,而不是图像。 – jarlh

+0

你输入OyuncuAdi ='Sunal' - 你确定它不是OyuncuSoyadı='Sunal'吗?你能提供你的代码吗? – plaidDK

+0

对不起,我编辑它。我必须是OyuncuSoyadi ='Sunal' –

试试这个:

declare @filmactors table 
(
film varchar(20), 
firstname varchar(20), 
surname varchar(20) 
) 

INSERT INTO @filmactors VALUES 
('Tosun Pasa', 'Kemal', 'Sunal'), 
('Tosun Pasa', 'Sener', 'Sen'), 
('Av Mevsimi', 'Sener', 'Sen') 

declare @firstActorName varchar(20) = 'Kemal' 
declare @firstActorSurName varchar(20) = 'Sunal' 
declare @secondActorName varchar(20) = 'Sener' 
declare @secondActorSurName varchar(20) = 'Sen' 


SELECT f1.film FROM @filmactors f1 
INNER JOIN @filmactors f2 ON f1.film = f2.film 
WHERE 
    f1.firstname = @firstActorName AND 
    f1.surname = @firstActorSurName 
AND f2.firstname = @secondActorName AND 
    f2.surname = @secondActorSurName 

结果:

Tosun Pasa 

这使用自联接。基本上它选择了所有带有第一个演员的电影和所有带有第二个演员的电影,并且在电影相同的地方加入他们。

+0

代码正在运行,但不像我的想法。我有演员表,电影表和电影表,其中包含演员和电影表的主键。所以,有这么多演员和电影。我想,你的解决方案只有2名演员 –

+0

@furkanaltun但你的问题说“如果用户输入两个不同的演员姓名”,所以我给了你两个演员的解决方案。你想要什么? –

+0

非常感谢您的帮助。我找到了我的答案,并加入了疑问。 –

假设你的表被称为[FilmActor]你可以做以下

SELECT FA1.[FilmAdi] 
FROM [FilmActor] FA1 
INNER JOIN [FilmActor] FA2 
ON FA2.[FilmAdi] = FA1.[FilmAdi] 
AND FA2.[OyuncuAdi] = 'Kemal' 
AND FA2.[OyuncuSurname] = 'Sunal' 
WHERE 
FA1.[OyuncuAdi]='Şener' 
AND FA1.[OyuncuSoyadı] = 'Şen' 
; 

这会给你所有的电影上有不止一个演员。

SELECT DISTINCT FilmName from (
SELECT [FilmName] 
    ,[ActorName] 
    ,[ActorSurname] 
    ,ROW_NUMBER() over(partition by filmname order by filmname) as rn 
FROM [LegOgSpass].[dbo].[actors] 
)X where X.rn > 1