我希望在信用记录状态发生变化之前和之后的某些日期找到许多客户。例如:
我希望桌子上的所有人在“约会”之前处于“待定”状态 从相同的人员列表中,我想确定其状态在“date2”之后从“挂起”变为“已批准”的客户列表。例如
下面是我的表格描述:
我尝试直接加入这两个表,但仍然不确定我是否收到了所有人。原因是,第二个交易表存储每个状态“状态”(待定,已批准)和时间。
两个表中常见的是:
答案 0 :(得分:1)
这将返回至少有一个交易的客户列表:
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,并且不会在结果集中生成重复项。
答案 1 :(得分:0)
假设您不会从“已批准”返回“待定”,则可以使用子查询执行此操作:
在t2.client_id = t1.client_id上从table2 t2内连接table1 t1中选择* 其中t2.client_id在 (从table2 t3中选择不同的t3.client_id,其中t3.status ='待定'和t3.date&lt;'2010/07/25') 和t2.status ='已批准'和t2.date&gt; '2010/07/30'