You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:42:22