这就是我的表格:
SELECT table2.status, table1.title
FROM table1 RIGHT JOIN table2 ON table1.id = table2.id
status title
EXPIRED USER A
EXPIRED USER B
ACTIVE USER B
EXPIRED USER C
我想从状态不活跃的用户那里得到标题,我试过了:
SELECT table2.status, table1.title
FROM table1 RIGHT JOIN table2 ON table1.id = table2.id
WHERE table2.status NOT LIKE 'ACTIVE'
status title
EXPIRED USER A
EXPIRED USER B
EXPIRED USER C
问题是用户B的状态为ACTIVE和EXPIRED,我想要一个表 向我展示了表中没有活动状态的所有人:
status title
EXPIRED USER A
EXPIRED USER C
答案 0 :(得分:3)
如果您展示了表格结构,那将会有所帮助。但这是解决这个问题的一种方法:
select t1.*
from table1 t1
where not exists (select 1
from table2 t2
where t2.id = t1.id and
t2.status = 'ACTiVE'
);
答案 1 :(得分:1)
这是一个语句,为每个非活动用户提供一行:
SELECT
CASE
WHEN MAX( case when table2.status = 'EXPIRED' then 1 else 0 end ) = 1 THEN 'EXPIRED'
WHEN MAX( case when table2.status = 'CANCELLED' then 1 else 0 end ) = 1 THEN 'CANCELLED'
WHEN MAX( case when table2.status = 'NEW' then 1 else 0 end ) = 1 THEN 'NEW'
ELSE 'NOT ACTIVE'
END as status
table1.title
FROM table1
INNER JOIN table2 ON table1.id = table2.id
GROUP BY table1.title
HAVING MAX( case when table2.status = 'ACTIVE' then 1 else 0 end ) = 0;
这里的技巧是获取所有行,按用户分组,如果用户存在ACTIVE状态,则创建一个标志。如果是这样,请从HAVING子句的列表中删除用户。然后我们决定显示哪个状态。我们再次使用聚合标志来确定我们的首选标志“EXPIRED”是否存在,否则“取消”等等。
BTW:我删除了右外连接,因为它对我没有意义。如果真的发生了在table1中没有条目的用户,那么外连接,但在结果列中有table2.id,而不是由table1.title组成。
答案 2 :(得分:0)
选择状态未激活的标题。
select * from table_name
where title not in( select distinct title
from table_name
where status = 'ACTIVE' )
子查询会获取状态为ACTIVE
和
的标题
外部查询提取标题不在ACTIVE
状态的所有记录。
答案 3 :(得分:0)
可能使用额外的外连接,如下所示: -
SELECT table2.status, table1.title
FROM table2
LEFT OUTER JOIN table1
ON table1.id = table2.id
LEFT OUTER JOIN table2 table2a
ON table1.id = table2a.id
AND table2a.status LIKE 'ACTIVE'
WHERE table2.status NOT LIKE 'ACTIVE'
AND table2a.id IS NULL
再次反对table2但仅针对活动记录,然后在WHERE子句中检查活动记录的连接行是否为空(即,未找到)