如何先在第一张表查询匹配记录,未找到则查询第二张表?
两表优先查询匹配记录的SQL错误修复
问题描述
- 拥有两张存储相似记录的表
store_1和store_2,需求是根据参考值查询匹配记录:优先从store_1查找,若未找到匹配项,再从store_2查询。 - 尝试的SQL语句返回了所有记录,语句如下:
SELECT * FROM keys WHERE EXISTS(SELECT * FROM store_1 WHERE store_1.key_number LIKE '%1726-1726280-17998%') or EXISTS(SELECT * FROM store_2 WHERE store_2.key_number LIKE '%1726-1726280-17998%');
错误原因
你的SQL逻辑出错了——EXISTS子查询没有和主表keys做关联匹配。只要store_1里存在任意一条符合LIKE条件的记录,整个EXISTS(...)就会返回true,导致WHERE条件直接成立,从而返回keys表的所有记录;同理store_2的判断也是如此,最终不管怎样都会返回全表数据。
解决方案
方案1:优先取store_1数据,无结果再取store_2
如果你的需求是先获取store_1的匹配记录,要是没结果再查store_2,可以用UNION ALL结合判断实现:
-- 先查store_1的匹配记录 SELECT * FROM store_1 WHERE key_number LIKE '%1726-1726280-17998%' UNION ALL -- 仅当store_1无匹配时,才查询store_2 SELECT * FROM store_2 WHERE key_number LIKE '%1726-1726280-17998%' AND NOT EXISTS(SELECT 1 FROM store_1 WHERE key_number LIKE '%1726-1726280-17998%');
方案2:关联keys表筛选匹配记录
如果你的逻辑是从keys表中筛选出在store_1或store_2中有对应匹配的记录,且优先store_1,需要修正关联条件:
SELECT k.* FROM keys k WHERE EXISTS( SELECT 1 FROM store_1 s1 WHERE s1.key_number = k.key_number -- 这里按实际关联逻辑调整,模糊匹配就用LIKE AND s1.key_number LIKE '%1726-1726280-17998%' ) OR ( NOT EXISTS( SELECT 1 FROM store_1 s1 WHERE s1.key_number = k.key_number AND s1.key_number LIKE '%1726-1726280-17998%' ) AND EXISTS( SELECT 1 FROM store_2 s2 WHERE s2.key_number = k.key_number -- 同理,按需调整关联方式 AND s2.key_number LIKE '%1726-1726280-17998%' ) );
提示:如果
key_number是完全匹配,建议用=代替LIKE,查询性能会更好;如果是模糊匹配,保留LIKE即可。
内容的提问来源于stack exchange,提问作者Islom
相关产品推荐
相关产品推荐

