SQL技术问询:对比表中两行并排除指定匹配行的实现方法
解决方案:基于行关联排除特定记录
针对你的需求——当表中存在RoomID = 150且Place_of_Birth = 'Vienna'的行时,排除RoomID = 150且Place_of_Birth = 'Las Vegas'的行——以下是两种可行的实现方案:
方案一:使用EXISTS子查询
通过子查询判断是否存在触发排除条件的记录,动态决定是否保留当前行:
SELECT TOP (1000) [RoomID], [First_Name], [Last_Name], [Place_of_Birth] FROM [Exercise].[dbo].[Customers] c WHERE NOT ( c.RoomID = 150 AND c.Place_of_Birth = 'Las Vegas' AND EXISTS ( SELECT 1 FROM [Exercise].[dbo].[Customers] WHERE RoomID = 150 AND Place_of_Birth = 'Vienna' ) )
逻辑说明:仅当当前行是RoomID=150+Las Vegas,且同时存在RoomID=150+Vienna的记录时,才排除该行;其他所有记录正常保留。
方案二:使用自连接+LEFT JOIN
通过表自连接关联同RoomID的记录,过滤需要排除的行:
SELECT TOP (1000) c1.RoomID, c1.First_Name, c1.Last_Name, c1.Place_of_Birth FROM [Exercise].[dbo].[Customers] c1 LEFT JOIN [Exercise].[dbo].[Customers] c2 ON c1.RoomID = c2.RoomID AND c1.Place_of_Birth = 'Las Vegas' AND c2.Place_of_Birth = 'Vienna' WHERE c2.RoomID IS NULL
逻辑说明:将表自身连接,匹配同一RoomID下,一行是Las Vegas、另一行是Vienna的组合;当存在这种组合时,Las Vegas的行因为能匹配到c2的记录,会被WHERE条件排除,其他记录则正常返回。
执行结果验证
以上两种方案执行后,返回的记录为:
- RoomID=120,Deidre Hanks,London
- RoomID=150,Jack Slims,Vienna
- RoomID=130,Anna-maria Garnet,Paris
完全符合你的需求。
内容的提问来源于stack exchange,提问作者Lucian Al-Zafari
相关产品推荐
相关产品推荐

