مرکزی مواد پر جائیں
ماڈیول 5 · سبق 2 از 4کورس میں 18/57~10 min
ماڈیول اسباق (2/4)

سیلف جوائن: اپنے ساتھ ایک میز

بعض اوقات آپ جس رشتے کو عبور کرنا چاہتے ہیں وہ دونوں کے درمیان نہیں ہوتا ہے۔ مختلف میزیں، لیکن ایک ہی میز کی قطاروں کے درمیان۔ عام مثال: a "زمرہ → ذیلی زمرہ" درجہ بندی، جہاں والدین اور بچہ دونوں کی قطاریں ہیں وہی categories ٹیبل، جو ایک parent_id سے منسلک ہے۔

ایک قطار (بچہ) اور "اس کی" دوسری قطار (والدین) کو ایک ساتھ پڑھنے کے لیے آپ a استعمال کرتے ہیں۔ خود شمولیت: ایک ہی جدول FROM میں دو بار ظاہر ہوتا ہے، دو کے ساتھ مختلف القابات.

نحو

SQL
SELECT colonne
FROM   tabella AS alias_a
JOIN   tabella AS alias_b ON alias_a.foreign_key = alias_b.id;

عرف لازمی ہے: اگر ہم AS a / AS b کو چھوڑ دیتے ہیں، PostgreSQL کے پاس کوئی نہیں ہے یہ جاننے کا طریقہ کہ جب ہم name یا id لکھتے ہیں تو ہمارا مطلب دو کاپیوں میں سے کون سا ہے۔

SQL
-- Ogni sotto-categoria con il nome della categoria padre:
SELECT child.name  AS subcategory,
       parent.name AS category
FROM   categories AS child
JOIN   categories AS parent ON child.parent_id = parent.id;

سادہ انگریزی میں پڑھیں: "categories کی قطاریں لیں بچہ، اور ہر ایک کے لیے categories کی قطار تلاش کریں جس کا نام والدین ہے جس کا id ہے بچے کا parent_id"۔

نتیجہ روٹ زمرہ جات کو خارج کرتا ہے (جن میں parent_id = NULL) کیونکہ ایک INNER JOIN بغیر مماثلت کے قطاروں کو چھوڑ دیتا ہے۔ اگر آپ شامل کرنا چاہتے ہیں۔ انہیں، LEFT JOIN استعمال کریں۔

"جڑیں بھی رکھنے" کے لیے بائیں بازو کے ساتھ خود شامل ہوں

SQL
-- Tutte le categorie, con nome del padre o NULL se sono radice:
SELECT child.name AS category,
       parent.name AS parent
FROM   categories AS child
LEFT JOIN categories AS parent ON child.parent_id = parent.id;

اب آپ کو parent = NULL کے ساتھ 9 قطاریں (ڈیٹا سیٹ میں ہر زمرہ) ملتی ہیں۔ 3 جڑوں کے لئے.

خود شمولیت کے ساتھ جمع کرنا

یہ GROUP BY کے ساتھ بہت اچھی طرح سے یہ پوچھتا ہے کہ "ہر ایک کتنے بچے کرتا ہے والدین کے پاس ہے":

SQL
SELECT p.name AS parent_category,
       COUNT(c.id) AS children
FROM   categories AS p
LEFT JOIN categories AS c ON c.parent_id = p.id
WHERE  p.parent_id IS NULL          -- solo le radici
GROUP BY p.name
ORDER BY p.name;

دو اہم تفصیلات نوٹ کریں:

  1. WHERE p.parent_id IS NULL فلٹرز جوائن سے پہلے: ہم صرف لیتے ہیں جڑیں بطور "بائیں ہاتھ کی میز"۔
  2. COUNT(c.id) (نہیں COUNT(*)) بغیر بچوں کے جڑوں کے لئے 0 لوٹاتا ہے، جبکہ COUNT(*) اس کے ساتھ LEFT JOIN قطار کی وجہ سے 1 لوٹائے گا NULL

خود ہی آزمائیں۔

ورزش#sql.m5.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

فی ogni sotto-categoria (categorie con parent_id NOT NULL)، mostra il nome della sotto-categoria e il nome della sua categoria-padre. ڈیو کالون: ذیلی زمرہ، زمرہ۔ Ordina فی زمرہ poi فی ذیلی زمرہ.

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

La condizione del self-JOIN è child.parent_id = parent.id۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m5.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

فی ogni زمرہ-ریڈیس (والدین_آئی ڈی NULL ہے)، mostra il nome e il numero di sotto-categorie. ڈیو کالون: نام، بچے۔ Ordina فی نام. انکلوڈی یونا ایونٹوئل ریڈیس سینزا فیگلی کون 0۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

زمرہ جات پر دو بار بائیں جوائن کریں (والدین کے لیے عرف p، بچے کے لیے c)۔ بغیر بچوں کے جڑوں پر 0 حاصل کرنے کے لیے COUNT(c.id) کا استعمال کریں، COUNT(*) کا نہیں۔

3 کوششوں کے بعد حل دستیاب ہے۔