[英]SQL Query direct or inner join
我想从信用记录中的状态更改前后的某些日期查找一些客户。 例如:
我希望表中的每个人在“ date”之前的状态为“ pending”,并且要从相同的人员列表中,每个人都想标识状态在“ date2”之后从“ pending”变为“ approved”的客户列表。 例如
以下是我的表格说明:
我曾尝试对这两个表进行直接联接,但仍不确定是否能找到所有人。 原因是,第二个事务表存储了每个状态“状态”(待定,已批准)和时间。
这两个表的共同点是:
这将返回具有至少一项交易的客户列表:
SELECT c.*
FROM CLIENTS c
WHERE EXISTS(SELECT NULL
FROM TRANSACTIONS t
WHERE t.client_id = c.client_id
AND t.status = 'pending'
AND t.transaction_date < 2010-07-25)
AND EXISTS(SELECT NULL
FROM TRANSACTIONS t
WHERE t.client_id = c.client_id
AND t.status = 'approved'
AND t.transaction_date > 2010-08-30)
如果您要计数,请使用:
SELECT COUNT(*)
FROM CLIENTS c
WHERE EXISTS(SELECT NULL
FROM TRANSACTIONS t
WHERE t.client_id = c.client_id
AND t.status = 'pending'
AND t.transaction_date < 2010-07-25)
AND EXISTS(SELECT NULL
FROM TRANSACTIONS t
WHERE t.client_id = c.client_id
AND t.status = 'approved'
AND t.transaction_date > 2010-08-30)
我不使用JOIN的原因是,对于符合条件的每个事务记录,该结果集将重复结果集中的行-您需要使用DISTINCT
或GROUP BY
来消除重复项。 如果存在一个或多个匹配条件的实例,并且在结果集中不重复,则EXIST将返回true。
假设您不会从“已批准”返回到“待处理”,则可以使用子查询来做到这一点:
从table2 t2的内部表中选择* * t2.client_id = t1.client_id,其中t2.client_id在其中(从table2 t3中选择不同的t3.client_id,其中t3.status ='Pending'和t3.date <'2010/07/25 ')和t2.status ='已批准',并且t2.date>'2010/07/30'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.