Sql 基于另一个表筛选具有无效字段值的数据 请考虑此脚本: 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
谢谢更新 由于您不想获取Sql 基于另一个表筛选具有无效字段值的数据 请考虑此脚本: 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,sql,sql-server,sql-server-2014,sql-server-2016,Sql,Sql Server,Sql Server 2014,Sql Server 2016,谢谢更新 由于您不想获取Movies表中存在FirstTable表中不存在的名称的记录,因此我们可以使用Movies.ActorName和FirstTable.name上的JOIN将其过滤掉。然后,我们可以像以前一样使用左连接,查找性别不匹配的演员: Select Id, tmp.Name, ActorName, ActorGender, ReleaseDate from Movies tmp join
Movies
表中存在FirstTable
表中不存在的名称的记录,因此我们可以使用Movies.ActorName
和FirstTable.name
上的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
表中ActorGender
与FirstTable
表中相应的Gender
不匹配的条目:
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
更新 由于您不想获取
Movies
表中存在FirstTable
表中不存在的名称的记录,因此我们可以使用Movies.ActorName
和FirstTable.name
上的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
表中ActorGender
与FirstTable
表中相应的Gender
不匹配的条目:
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
如果男女同名怎么办?我的意思是,事实上,他们存在吗?这正是问题所在。上面的查询返回的
Tom
不正确如果,两个性别有相同的名字?我的意思是,事实上,他们存在吗?这正是问题所在。上面的查询返回了Tom
错误的存储,但很抱歉我忘了在Movies
表中添加一些记录。有些记录只存在于Movies
表中,我不希望查询返回这些记录。@请参阅我的编辑。我想这会解决你的问题。谢谢它的工作,但我很抱歉我忘了在电影
表中添加一些记录。有些记录只存在于Movies
表中,我不希望查询返回这些记录。@请参阅我的编辑。我想这会解决你的问题。