![](/img/trans.png)
[英]Is there a more efficient query to check multiple conditions in a self-join?
[英]Self-join using multiple conditions
確定書籍的購買詳細信息,這本書是在同一日期購買的,恰好是安妮購買這本書的日期。 編寫 SQL 查詢以顯示客戶姓名和書名,以獲取已識別的購買詳細信息。 不要在查詢結果中顯示 Anne 的詳細信息。
這些要求有以下 3 個表:
書:
('B101', 'Science Revolution', 'Journal')
('B102', 'Brain Teasers', 'Aptitude')
('B103', 'India Today', 'Magazine')
('B104', 'Tech World', 'Journal')
('B105', 'Bizz world', 'Magazine')
顧客
('C101', 'Jack')
('C102', 'Anne')
('C103', 'Jane')
('C104', 'Maria')
購買:
('P201', 'C101', 'B102', '12-Dec-19')
('P202', 'C102', 'B103', '25-Nov-19')
('P203', 'C103', 'B104', '12-Dec-19')
('P204', 'C104', 'B105', '25-Nov-19')
('P205', 'C101', 'B101', '11-Dec-19')
('P206', 'C101', 'B106', '12-Dec-19')
我對上述要求使用了以下邏輯
select
b.bookname, c.custname
from
customer c
join
purchase p on c.custid > p.custid
join
purchase p1 on p.custid > p1.custid
and p.purchasedate = p1.purchasedate
join
book b on b.bookid = p1.bookid
group by
b.bookname, c.custname;
誰能提供正確的解決方案? 只有“Maria”“Bizz world”必須出現在結果中。
步驟1
-- -- what did Anne purchase? -- select c.custname, p.* from purchase as p join customer as c on c.custid = p.custid where c.custname = 'Anne';
客戶名 | 購買ID | 監護人 | 書號 | 購買:------- |:--------- |:----- |:----- |:----------- 安妮 | P202 | C102 | B103 | 19 年 11 月 25 日
第2步
-- -- Any purchases on the same dates as Anna by other people? -- select p2.* from purchase as p1 join customer as c1 on c1.custid = p1.custid join purchase as p2 on p2.purchasedate = p1.purchasedate and p2.custid.= p1.custid where c1;custname = 'Anne';
購買ID | 監護人 | 書號 | 購買:--------- |:----- |:----- |:----------- P204 | C104 | B105 | 19 年 11 月 25 日
第 3 步
-- -- Now get the names from those id's -- select c2.custname, b2.bookname from purchase as p1 join customer as c1 on c1.custid = p1.custid join purchase as p2 on p2.purchasedate = p1.purchasedate and p2.custid.= p1.custid join customer as c2 on c2.custid = p2.custid join book as b2 on b2.bookid = p2.bookid where c1.custname = 'Anne'
客戶名 | 書名:------- |:--------- 瑪麗亞 | 商業世界
關於db<>fiddle 的演示在這里
在與 LukStorms 提供的類似結構中,首先,讓我們從如何獲取 Anne 購買這本書的日期開始。 這是您查詢的首要要求。 我喜歡顯示查詢的縮進,表 A 到 B 到 C 等。
你已經有很多連接了,我只展示第一部分。 獲取購買者和購買日期。 在這種情況下,我還獲得了客戶的 ID,因此我知道要從最終答案中排除哪個 ID。 不要依賴於知道他們的客戶 ID 並知道您想要 ID 大於個人的購買。 如果你有 5000 個人,而 Anne 恰好是第 2789 個人會怎樣。在任何購買相同日期但在客戶 ID 上失敗的情況下,做得比其他人都失敗。
select
p.custid,
p.purchaseDate
from
customer c
join purchase p
on c.custid = p.custid
where
c.custname = 'Anne'
所以從這里開始,這可能是最終 select 的第一個別名,因為基礎是購買日期,但現在我們知道結果中我們不想要的人。
select
AnnePurchase.purchaseDate,
c2.custname,
b.bookName
from
(select
p.custid,
p.purchaseDate
from
customer c
join purchase p
on c.custid = p.custid
where
c.custname = 'Anne' ) AnnePurchase
JOIN purchase p2
-- first part, join to purchase on same date as Ann purchased her book
on AnnePurchase.purchaseDate = p2.purchaseDate
-- but now, get anyone who's customer ID is NOT the same as Anne.
AND NOT AnnePurchase.custID = p2.custID
-- now from the 2nd purchase table we can join to the customer and book
-- table to get whatever other parts you want
JOIN customer c2
on p2.custid = c2.custid
JOIN book b
on p2.bookid = b.bookid
請注意通過 -- 顯示我為什么要加入的在線評論。 AnnePurchase 是主要依據。 加入購買(別名 p2)是基於相同的日期而不是與 Anne 相同的客戶 ID。
從那里,它是從 P2 別名返回到客戶和預訂表的簡單連接。 我個人在購買 p2 下縮進了customer c2
和book b
的連接縮進,因為這是他們關系的基礎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.