根据一列比较两个不同的行
Comparing two different rows according to one column
示例数据集:
我有 3 个不同的列
- FilmAdi(电影名称),
- OyuncuAdi(演员姓名)
- 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
假设您的 table 名为 [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'
;
试试这个:
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
这使用了自连接。基本上它会选择所有有第一位演员的电影和所有有第二位演员的电影,并在电影相同的地方加入它们。
这会给你所有有不止一个演员的电影。
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
示例数据集:
我有 3 个不同的列
- FilmAdi(电影名称),
- OyuncuAdi(演员姓名)
- 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
假设您的 table 名为 [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'
;
试试这个:
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
这使用了自连接。基本上它会选择所有有第一位演员的电影和所有有第二位演员的电影,并在电影相同的地方加入它们。
这会给你所有有不止一个演员的电影。
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