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
表中,我不希望查询返回这些记录。@请参阅我的编辑。我想这会解决你的问题。