根据另一个 table 过滤具有无效字段值的数据
Filter data that has invalid field value based on another table
请考虑这个脚本:
declare @FirstTable Table
(
Name nvarchar(50), -- Key
Gender tinyint, -- Key 1 for Male, 2 for Female
DateModified datetime
)
insert into @FirstTable
Values(N'Tom' , 1, GETDATE()),
(N'Tom' , 2, GETDATE()),
(N'Clare' , 2, GETDATE()),
(N'Lauren' , 1, GETDATE()),
(N'Sara' , 2, GETDATE()),
(N'Al' , 1, GETDATE()),
(N'Kevin' , 1, GETDATE()),
(N'Meril' , 2, GETDATE())
declare @Movies Table
(
Id int identity(1,1),
Name nvarchar(50), -- Key
ActorName Nvarchar(50),
ActorGender tinyint,
ReleaseDate datetime
)
insert into @Movies
Values (N'Movie 1', N'Tom' , 1, GETDATE()),
(N'Movie 2', N'Kevin' , 2, GETDATE()),
(N'Movie 3', N'Meril' , 2, GETDATE()),
(N'Movie 4', N'Meril' , 2, GETDATE()),
(N'Movie 5', N'Clare' , 1, GETDATE()),
(N'Movie 6', N'Tom' , 2, GETDATE()),
(N'Movie 7', N'Al' , 1, GETDATE()),
(N'Movie 8', N'Sara' , 1, GETDATE()),
(N'Movie 9', N'Ben' , 2, GETDATE()),
(N'Movie 10', N'Viera' , 2, GETDATE()),
(N'Movie 11', N'George' , 2, GETDATE()),
(N'Movie 12', N'Frank' , 2, GETDATE()),
(N'Movie 13', N'Kevin' , 2, GETDATE())
select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from @Movies tmp inner join @FirstTable gn on tmp.ActorName = gn.Name
where tmp.ActorGender <> gn.Gender
我想 select Movie
table 中具有无效性别的数据。例如,如果我们假设 Tom
是男性和女性之间的通用名称,则上面的查询 returns Tom
结果(这是不正确的)。请帮助我更正我的 select 陈述。
编辑 1)
有一些记录(姓名)只存在于Movies
table中,而在FirstTable
中没有相应的记录。我不想查询 returns 那些记录。
感谢@Nick,我想要这个结果:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
10 Movie 10 Kevin 2 22/12/2018 07:20:14
谢谢
更新
由于您不想获取 Movies
table 中不存在 FirstTable
table 中的记录,我们可以在 Movies.ActorName
和 FirstTable.Name
上使用 JOIN
过滤掉它们。然后我们可以像以前一样使用 LEFT JOIN
来查找性别不匹配的演员:
Select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from Movies tmp
join FirstTable gn on tmp.ActorName = gn.Name
left join FirstTable gn2 on tmp.ActorName = gn2.Name AND tmp.ActorGender = gn2.Gender
where gn2.Name IS NULL
更新后的输出:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
13 Movie 13 Kevin 2 22/12/2018 07:20:14
原答案
您可以使用 LEFT JOIN
在 Movies
table 中查找条目,其中 ActorGender
与 FirstTable
table:
Select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from Movies tmp
left join FirstTable gn on tmp.ActorName = gn.Name AND tmp.ActorGender = gn.Gender
where gn.Name IS NULL
输出:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
10 Movie 10 Kevin 2 22/12/2018 07:20:14
请考虑这个脚本:
declare @FirstTable Table
(
Name nvarchar(50), -- Key
Gender tinyint, -- Key 1 for Male, 2 for Female
DateModified datetime
)
insert into @FirstTable
Values(N'Tom' , 1, GETDATE()),
(N'Tom' , 2, GETDATE()),
(N'Clare' , 2, GETDATE()),
(N'Lauren' , 1, GETDATE()),
(N'Sara' , 2, GETDATE()),
(N'Al' , 1, GETDATE()),
(N'Kevin' , 1, GETDATE()),
(N'Meril' , 2, GETDATE())
declare @Movies Table
(
Id int identity(1,1),
Name nvarchar(50), -- Key
ActorName Nvarchar(50),
ActorGender tinyint,
ReleaseDate datetime
)
insert into @Movies
Values (N'Movie 1', N'Tom' , 1, GETDATE()),
(N'Movie 2', N'Kevin' , 2, GETDATE()),
(N'Movie 3', N'Meril' , 2, GETDATE()),
(N'Movie 4', N'Meril' , 2, GETDATE()),
(N'Movie 5', N'Clare' , 1, GETDATE()),
(N'Movie 6', N'Tom' , 2, GETDATE()),
(N'Movie 7', N'Al' , 1, GETDATE()),
(N'Movie 8', N'Sara' , 1, GETDATE()),
(N'Movie 9', N'Ben' , 2, GETDATE()),
(N'Movie 10', N'Viera' , 2, GETDATE()),
(N'Movie 11', N'George' , 2, GETDATE()),
(N'Movie 12', N'Frank' , 2, GETDATE()),
(N'Movie 13', N'Kevin' , 2, GETDATE())
select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from @Movies tmp inner join @FirstTable gn on tmp.ActorName = gn.Name
where tmp.ActorGender <> gn.Gender
我想 select Movie
table 中具有无效性别的数据。例如,如果我们假设 Tom
是男性和女性之间的通用名称,则上面的查询 returns Tom
结果(这是不正确的)。请帮助我更正我的 select 陈述。
编辑 1)
有一些记录(姓名)只存在于Movies
table中,而在FirstTable
中没有相应的记录。我不想查询 returns 那些记录。
感谢@Nick,我想要这个结果:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
10 Movie 10 Kevin 2 22/12/2018 07:20:14
谢谢
更新
由于您不想获取 Movies
table 中不存在 FirstTable
table 中的记录,我们可以在 Movies.ActorName
和 FirstTable.Name
上使用 JOIN
过滤掉它们。然后我们可以像以前一样使用 LEFT JOIN
来查找性别不匹配的演员:
Select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from Movies tmp
join FirstTable gn on tmp.ActorName = gn.Name
left join FirstTable gn2 on tmp.ActorName = gn2.Name AND tmp.ActorGender = gn2.Gender
where gn2.Name IS NULL
更新后的输出:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
13 Movie 13 Kevin 2 22/12/2018 07:20:14
原答案
您可以使用 LEFT JOIN
在 Movies
table 中查找条目,其中 ActorGender
与 FirstTable
table:
Select Id,
tmp.Name,
ActorName,
ActorGender,
ReleaseDate
from Movies tmp
left join FirstTable gn on tmp.ActorName = gn.Name AND tmp.ActorGender = gn.Gender
where gn.Name IS NULL
输出:
Id Name ActorName ActorGender ReleaseDate
2 Movie 2 Kevin 2 22/12/2018 07:20:14
5 Movie 5 Clare 1 22/12/2018 07:20:14
8 Movie 8 Sara 1 22/12/2018 07:20:14
10 Movie 10 Kevin 2 22/12/2018 07:20:14