如何从COND表中提取满足特定双条件组合的NAME值
问题需求
现有COND表,结构和数据如下:
ORDERNO NAME OUTPUT SIGN 12 HOUSE O + 13 CAR O - 14 BOOK I + 13 HOUSE I A
需要找出满足以下要求的NAME:同一个NAME必须同时存在两条记录——一条是OUTPUT='O'且SIGN='+',另一条是OUTPUT='I'且SIGN='A'。按这个规则,示例里只有HOUSE符合条件。
两种可行的SQL写法
写法一:分组统计筛选
先把符合两个条件之一的记录挑出来,再按NAME分组,检查是否同时包含两种记录:
SELECT NAME FROM COND WHERE (OUTPUT = 'O' AND SIGN = '+') OR (OUTPUT = 'I' AND SIGN = 'A') GROUP BY NAME HAVING COUNT(DISTINCT CONCAT(OUTPUT, SIGN)) = 2;
逻辑很直白:先过滤出目标候选记录,然后看每个NAME是不是刚好有两种不同的目标组合,满足的就是我们要的结果。
写法二:自连接匹配
把表和自己连起来,直接找同一个NAME下分别满足两个条件的记录:
SELECT DISTINCT c1.NAME FROM COND c1 JOIN COND c2 ON c1.NAME = c2.NAME WHERE c1.OUTPUT = 'O' AND c1.SIGN = '+' AND c2.OUTPUT = 'I' AND c2.SIGN = 'A';
这个思路更直接:找一条O+的记录,再匹配同NAME的IA记录,能匹配上的NAME就是符合要求的,用DISTINCT避免重复输出。
内容的提问来源于stack exchange,提问作者Miguel7799
相关产品推荐
相关产品推荐

