[英]How to retrieve all records of joined table SQL
所以我有 2 張桌子: customer
和purchase
。 我想在購買時使用某些過濾器來獲取客戶及其所有購買; 然而; 如果有任何匹配過濾器,我想獲取所有購買記錄。
例如,如果我有 John Doe 在 2019 年 1 月 2 日進行了一次購買,在01/02/19
年10/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 JOIN
的ON
子句中使用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
還不夠嗎?
或者,也許您需要以下類似的東西:
如果您打算使用特定日期購買所有商品,您可以這樣做: 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')
如果您計划在某個日期范圍內購買所有商品:
SELECT * FROM customer LEFT JOIN Purchase ON purchase.customer_id = customer.id AND (purchase.purchase_date BETWEEN '2019-02-01' AND '2019-02-10')
注意括號很重要
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.