如何从基于 sql 服务器中的表的结果中排除记录



我有一个结果集,如下所示:

SELECT g2.ID, g2.[Name]
FROM cte c
LEFT JOIN #Market gc WITH(NOLOCK) ON c.ID = gc.ID
INNER JOIN list.Type gt WITH(NOLOCK) ON g2.TypeId = gt.TypeID
WHERE  
gt.MarketCount IS NOT NULL
GROUP BY g2.GameID, g2.[Name] 
ORDER BY g2.[Name]

这是输出

ID     | Name
2   |Apple
5   |Pear
14  |Strawberry

现在我有另一个称为映射的表,如下所示

ID  | Name
14  | Strawberry

我试图实现的是,从我从存储过程中返回的上述数据结果中,我想将其与映射表进行比较,如果他们的 Mapping 中的 ID 与结果集匹配,它应该忽略该行并给我以下结果,例如:预期结果

ID  | Name
2   |Apple
5   |Pear

由于映射表中存在 ID 14,因此应删除该记录

使用左连接并按未映射映射表的位置进行筛选

with t1 as
(SELECT g2.ID, g2.[Name]
FROM cte c
LEFT JOIN #Market gc WITH(NOLOCK) ON c.ID = gc.ID
INNER JOIN list.Type gt WITH(NOLOCK) ON g2.TypeId = gt.TypeID
WHERE  
gt.MarketCount IS NOT NULL
GROUP BY g2.GameID, g2.[Name] 
ORDER BY g2.[Name
) select t1.* from t1 left join mappingt t2 on t1.id=t2.id
where t2.id is null

您的查询非常不正确,我在查询中没有找到任何g2别名,所以我会这样做:

WITH t AS (
SELECT DISTINCT g2.ID, g2.[Name]
FROM cte c INNER JOIN 
#Market gc WITH(NOLOCK) 
ON c.ID = gc.ID INNER JOIN 
list.Type gt WITH(NOLOCK) 
ON g2.TypeId = gt.TypeID
WHERE gt.MarketCount IS NOT NULL
)
SELECT t.*
FROM t 
WHERE NOT EXISTS (SELECT 1 FROM mappingt M WHERE m.id = t.id);

我建议在使用NOLOCK提示之前访问Aaron博客。

由于您提到了一个存储过程,因此可以将该 sproc 的结果映射到表中。然后使用标准左联接筛选结果

declare @temptable table (id int, name varchar(255))
insert into @temptable exec storedProcname 
select * 
from @temptable t
left join Mapping m on m.Id = t.Id
where m.id is null

最新更新