簡體   English   中英

如何檢索連接表 SQL 的所有記錄

[英]How to retrieve all records of joined table SQL

所以我有 2 張桌子: customerpurchase 我想在購買時使用某些過濾器來獲取客戶及其所有購買; 然而; 如果有任何匹配過濾器,我想獲取所有購買記錄。

例如,如果我有 John Doe 在 2019 年 1 月 2 日進行了一次購買,在01/02/1910/01/2019月 1 日進行了另一次購買

目前我正在這樣做:

SELECT * 
FROM customer LEFT JOIN Purchase 
on purchase ON purchase.customer_id = customer.id 
AND purchase.purchase_date = '2019-02-01'

但是,這只檢索單次購買; 當只有一個符合條件時,有沒有辦法檢索所有購買?

謝謝

我想你想要:

SELECT c.*, p.*
FROM customer c JOIN
     Purchase p
     ON p.customer_id = c.id 
WHERE EXISTS (SELECT 1
              FROM purchase p2
              WHERE p2.customer_id = c.id AND
                    p2.purchase_date = '2019-02-01'
             );

您可以在LEFT JOINON子句中使用EXISTS

SELECT * 
FROM customer c LEFT JOIN Purchase p 
ON p.customer_id = c.id 
AND EXISTS (
  SELECT 1 FROM Purchase
  WHERE customer_id = p.customer_id AND purchase_date = '2019-02-01'
) 

SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id還不夠嗎?

或者,也許您需要以下類似的東西:

  1. 如果您打算使用特定日期購買所有商品,您可以這樣做: SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id AND purchase.purchase_date IN ('2019-02-01', '2019-02-10', '2019-12-03')SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id WHERE purchase.purchase_date IN ('2019-02-01', '2019-02-10', '2019-12-03')

  2. 如果您計划在某個日期范圍內購買所有商品:

SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id AND (purchase.purchase_date BETWEEN '2019-02-01' AND '2019-02-10')

注意括號很重要

  1. 如果您計划在任何購買日期都獲得所有客戶的購買,這應該足夠了:

SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id

我將 go 與這樣的連接:

SELECT c.*, pc.* 
FROM (
   SELECT DISTINCT customer_id 
   FROM purchase 
   WHERE purchase_date = '2019-02-01' 
) AS p0                                                     -- The filtered purchase(s)
INNER JOIN customer AS c ON p0.customer_id = c.customer_id  -- The customers who made those purchases
INNER JOIN Purchase AS pc ON c.customer_id = pc.customer_id -- All purchases by those customers
;

從技術上講,如果您實際上並不關心客戶數據,則可以完全跳過該表。

需要子查詢是因為如果客戶進行了多次滿足 p0 標准的購買,則直接連接將生成其數據的多個副本。

或者,您可以像這樣使用相同的子查詢:

SELECT *
FROM customer AS c 
INNER JOIN Purchase AS pc ON c.customer_id = pc.customer_id
WHERE c.customer_id IN (
   SELECT DISTINCT customer_id 
   FROM purchase 
   WHERE purchase_date = '2019-02-01' 
  )
;

第二個的好處是它更直接地反映了任務的自然語言表達; "獲取在 '2019-02-01' 購買的客戶的所有客戶購買數據"

第一個也有,但有些人可能覺得它不自然,而且有點模棱兩可; “對於 '2019-02-01' 的購買,查找所有購買數據的客戶的購買數據”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM