Ravindra BagaleCourses & study guides Track your progress

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 बनवा.

पायऱ्या

  1. पहिलं उदाहरण run करा आणि खऱ्या total ची join नंतरच्या total शी तुलना करा.
  2. Join नंतरचा total नेमका दुप्पट आहे ते बघा, कारण hub 1 चे 2 contacts आहेत.
  3. प्रत्येक row मध्ये एक currency असलेल्या per-hub total साठी दुसरं उदाहरण run करा.
  4. 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_inrjoined_total_inr
11302260

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_codecurrencyshipmentstotal_fee
PNQ-01INR31130
BOM-02INR21130
DXB-01AED2105
LHR-03GBP118
SIN-01SGD0NULL

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.