我这里有两个表,第一个是客户表,第二个是政策表。政策可以有多种状态 - 有效、无效、已取消等。
现在,我需要选择客户和他们的有效政策,只有在有效政策不存在时才取消政策!
应该是这样的
SELECT c.customer_id, p.policy_id
FROM table_customer as c
INNER JOIN table_policy as p ON c.customer_id = p.customer_id
WHERE p.status = 'active' OR p.status = 'cancelled'
//(but select cancelled only if there are no active)
这可以在一次查询中完成吗?
提前致谢。
最佳答案
要检查某物是否不存在,您可以使用 not exists
,它检查(依赖)子查询是否(不)为空:
SELECT c.customer_id, p.policy_id
FROM table_customer as c
INNER JOIN table_policy as p ON c.customer_id = p.customer_id
WHERE p.status = 'active'
OR (p.status = 'cancelled'
AND NOT EXISTS (SELECT 1 FROM table_policy as p1
WHERE p1.customer_id = p.customer_id
AND p1.status = 'active'))
这可以很方便地直接理解为选择客户及其有效政策和取消的政策(仅当[此客户的]有效[政策]不存在时)。
可能只是对 select 1
中的 1
的注释:因为你选择什么并不重要,只要有东西就在那里,1
只是一个方便的选择。
关于mysql select 和几个条件,但如果第一个不满足,则满足第二个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778198/