SQL查询直接或内部联接

时间:2010-09-22 02:36:56

标签: sql mysql join

我希望在信用记录状态发生变化之前和之后的某些日期找到许多客户。例如:

  • date = 2010/07/25
  • date2 = 2010/08/30

我希望桌子上的所有人在“约会”之前处于“待定”状态 从相同的人员列表中,我想确定其状态在“date2”之后从“挂起”变为“已批准”的客户列表。例如

  • 在“date”之前,我有20k个客户处于“待定”状态
  • 在“date2”之后,我仍然拥有20k客户,但有些客户从待定到批准,我想识别这些客户

下面是我的表格描述:

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

我尝试直接加入这两个表,但仍然不确定我是否收到了所有人。原因是,第二个交易表存储每个状态“状态”(待定,已批准)和时间。

两个表中常见的是:

  • 状态
  • 的client_id

2 个答案:

答案 0 :(得分: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摆脱重复。如果存在一个或多个匹配条件实例,则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'