簡體   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