簡體   English   中英

使用多個條件進行自聯接

[英]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 c2book b的連接縮進,因為這是他們關系的基礎。

暫無
暫無

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

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