15. INNER JOIN आणि LEFT JOIN (आधी लागणारे दोन joins)
15.4 Join नंतर गळलेले आणि वाढलेले rows कसे ओळखायचे
का (Why). Join मुळे असा total येऊ शकतो जो बरोबर दिसतो पण चुकीचा असतो, कारण rows गळले किंवा परत आले. दोन्ही पकडायला एक झटपट पद्धत लागते.
काय (What). INNER JOIN ला match सापडला नाही की rows गळतात. दुसऱ्या बाजूला key unique नसेल तर rows परत येतात: hub 1 चे 2 contacts असतील तर hub 1 ची प्रत्येक shipment दोनदा येते, आणि SUM तिची fee दोनदा मोजतो. तसंच वेगवेगळ्या currencies मधल्या fees कधीच एकत्र बेरीज करू नका; त्याऐवजी currency नुसार group करा.
कसं (How). Contacts join सोबत आणि त्याशिवाय hub 1 च्या fees चा total काढा, मग currency दाखवणारा सुरक्षित per-hub total बनवा.
पायऱ्या
- पहिलं उदाहरण run करा आणि खऱ्या total ची join नंतरच्या total शी तुलना करा.
- Join नंतरचा total नेमका दुप्पट आहे ते बघा, कारण hub 1 चे 2 contacts आहेत.
- प्रत्येक row मध्ये एक currency असलेल्या per-hub total साठी दुसरं उदाहरण run करा.
- Join नंतर नेहमी rows चा आकडा आणि माहीत असलेला एखादा total तपासा.
उदाहरणे
उदाहरण 1 · dataset: swiftship_logistics
SELECT
(SELECT SUM(fee) FROM shipments WHERE hub_id = 1) AS true_total_inr,
(SELECT SUM(s.fee)
FROM shipments AS s
INNER JOIN hub_contacts AS hc ON hc.hub_id = s.hub_id
WHERE s.hub_id = 1) AS joined_total_inr;Output
| true_total_inr | joined_total_inr |
|---|---|
| 1130 | 2260 |
Meaning. Hub 1 चा खरा total 1130 INR आहे, पण contacts join केल्यावर 2260 INR दिसतो. प्रत्येक shipment प्रत्येक contact साठी एकदा परत आली, म्हणून fee दोनदा मोजली गेली.
उदाहरण 2 · dataset: swiftship_logistics
SELECT h.hub_code, h.currency,
COUNT(s.shipment_id) AS shipments,
SUM(s.fee) AS total_fee
FROM hubs AS h
LEFT JOIN shipments AS s ON s.hub_id = h.hub_id
GROUP BY h.hub_id, h.hub_code, h.currency
ORDER BY h.hub_id;Output
| hub_code | currency | shipments | total_fee |
|---|---|---|---|
| PNQ-01 | INR | 3 | 1130 |
| BOM-02 | INR | 2 | 1130 |
| DXB-01 | AED | 2 | 105 |
| LHR-03 | GBP | 1 | 18 |
| SIN-01 | SGD | 0 | NULL |
Meaning. प्रत्येक row एक hub त्याच्याच currency मध्ये दाखवतो: PNQ-01 3 shipments 1130 INR, BOM-02 2 shipments 1130 INR, DXB-01 2 shipments 105 AED, LHR-03 1 shipment 18 GBP, SIN-01 0 shipments. SIN-01 साठी 0 नाही तर NULL दिसतो, कारण एकही row नसेल तर SUM NULL देतो. Shipments 1009 आणि 1010 इथे नाहीत, कारण त्यांना valid hub नाही.
Ravindra Bagale's Tip
If you need a list from a table with repeats, such as contacts, total the main table first in a subquery and join the result afterwards.
Ravindra Bagale's Tip – मराठी
Contacts सारख्या repeats असलेल्या table मधली माहिती हवी असेल तर आधी मुख्य table चा total subquery मध्ये काढा आणि नंतर तो result join करा.
Ravindra Bagale's Tip – हिंदी
Contacts जैसी repeats वाली table से जानकारी चाहिए तो पहले मुख्य table का total subquery में निकालिए और फिर उस result को join कीजिए।