繁体   English   中英

SQL查询直接或内部联接

[英]SQL Query direct or inner join

我想从信用记录中的状态更改前后的某些日期查找一些客户。 例如:

  • 日期= 2010/07/25
  • date2 = 2010/08/30

我希望表中的每个人在“ date”之前的状态为“ pending”,并且要从相同的人员列表中,每个人都想标识状态在“ date2”之后从“ pending”变为“ approved”的客户列表。 例如

  • 在“日期”之前,我有2万个客户处于“待处理”状态
  • 在“ date2”之后,我仍然有2万个客户,但是有些从待定变为批准,我想确定这些客户

以下是我的表格说明:

  • 我有一张只存储唯一信息的表
  • 第二个是第一个表的事务表,该表记录每个带有时间戳的活动。 它非常详细的分钟记录表记录。

我曾尝试对这两个表进行直接联接,但仍不确定是否能找到所有人。 原因是,第二个事务表存储了每个状态“状态”(待定,已批准)和时间。

这两个表的共同点是:

  • 状态
  • client_id

这将返回具有至少一项交易的客户列表:

  • 在2010-07-25之前,状态为“待处理”
  • 在2010-08-30之后,状态为“已批准”

询问

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的原因是,对于符合条件的每个事务记录,该结果集将重复结果集中的行-您需要使用DISTINCTGROUP 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM