【问题标题】:SQL Query direct or inner joinSQL 查询直接或内连接
【发布时间】:2011-04-15 12:31:47
【问题描述】:

我想查找在信用记录发生状态变化之前和之后的特定日期的一些客户。例如:

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

我希望表格中在“日期”之前状态为“待定”的每个人 并且从相同的人员列表中,我想确定在“date2”之后状态从“待定”变为“已批准”的客户列表。例如

  • 在“日期”之前,我有 20,000 个处于“待定”状态的客户
  • 在“date2”之后,我仍有 20k 客户,但有些客户从待定变为已批准,我想确定这些客户

下面是我的表格描述:

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

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

这两个表的共同点是:

  • 状态
  • client_id

【问题讨论】:

  • 为什么status 会出现在两个表中?两个表、一些示例数据和预期输出的 CREATE TABLE 语句会很有帮助。
  • status 在两个表中,因为第一个表只存储最近的状态,即只有“一个”状态,而事务表存储适用于客户端的每个状态。

标签: sql mysql join


【解决方案1】:

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

  • 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 来摆脱重复项。如果存在一个或多个匹配条件实例,EXISTs 将返回 true,并且不会在结果集中重复。

【讨论】:

  • 感谢这真的给了我正确的结果集,因为我手动检查它们进行比较。
【解决方案2】:

假设您不会从 Approved 回到 Pending,您可以使用子查询来做到这一点:

select * from table2 t2 inner join table1 t1 on t2.client_id = t1.client_id 其中 t2.client_id 在 (从 table2 t3 中选择不同的 t3.client_id,其中 t3.status='Pending' 和 t3.date '2010/07/30'

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2016-03-29
    • 2015-06-21
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2013-04-26
    相关资源
    最近更新 更多