如何实现按BookingID判断Route列是否含字符D的SQL查询
解决BookingID关联Route含D的判断问题
给你两种简便方法,都能避免返回重复行,每个BookingID只出一次结果:
方法一:分组聚合判断
利用GROUP BY按BookingID分组,结合聚合函数和CASE语句判断是否存在含D的Route:
SELECT b.BookingID, CASE WHEN MAX(CASE WHEN bd.Route LIKE '%D%' THEN 1 ELSE 0 END) = 1 THEN 'Yes' ELSE 'No' END AS related_to_D FROM Booking b LEFT JOIN BookingDesc bd ON b.BookingID = bd.BookingID GROUP BY b.BookingID;
原理是:对每个BookingID的所有Route记录,标记出含D的记录为1,否则为0,再用MAX取最大值——只要有一个1,就说明该BookingID存在含D的Route,最终转成Yes/No的结果。
方法二:EXISTS子查询判断
用EXISTS子查询直接检查当前BookingID是否有匹配的含D的Route记录,效率通常更高:
SELECT BookingID, CASE WHEN EXISTS ( SELECT 1 FROM BookingDesc bd WHERE bd.BookingID = b.BookingID AND bd.Route LIKE '%D%' ) THEN 'Yes' ELSE 'No' END AS related_to_D FROM Booking b;
EXISTS只要找到第一条匹配的记录就会停止查询,不用遍历该BookingID的所有Route,而且天然保证每个BookingID只返回一行结果。
你之前的SQL返回重复行,大概率是直接关联两张表后没有做分组或者去重操作,导致每个Route记录对应一行结果,上面两种方法都能解决这个问题。
内容的提问来源于stack exchange,提问作者Kewei
相关产品推荐
相关产品推荐

