মূল কন্টেন্টে যান
মডিউল 5 · 2-এর পাঠ 4কোর্সে 18/57~10 min
মডিউল পাঠ (2/4)

স্ব-যোগদান: নিজের সাথে একটি টেবিল

কখনও কখনও আপনি যে সম্পর্কটি অতিক্রম করতে চান তা দুজনের মধ্যে নয় ভিন্ন টেবিল, কিন্তু একই টেবিলের সারি মধ্যে। সাধারণ উদাহরণ: ক "বিভাগ → উপশ্রেণি" শ্রেণিবিন্যাস, যেখানে পিতামাতা এবং শিশু উভয়ই এর সারি একই categories টেবিল, একটি parent_id দ্বারা সংযুক্ত।

এক সারি (শিশু) এবং "তার" অন্য সারি (পিতামাতা) একসাথে পড়তে আপনি একটি ব্যবহার করেন স্ব-যোগদান: একই সারণী 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 প্রদান করে, যেখানে LEFT JOIN এর সাথে সারির কারণে COUNT(*) 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. ডিউ কোলন: উপশ্রেণী, বিভাগ। উপশ্রেণি প্রতি বিভাগ poi প্রতি Ordina.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

লা কনডিজিয়ন ডেল সেলফ-জোইন è child.parent_id = parent.id.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m5.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

প্রতি ogni শ্রেণীবিভাগ-মূল (parent_id IS NULL), mostra il nome e il numero di sotto-categorie. ডিউ কোলন: নাম, শিশু। নাম অনুযায়ী Ordina. ইনক্লুডি una eventuale radice senza figlie con 0.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

দুইবার বিভাগগুলিতে বাম যোগ দিন (পিতামাতার জন্য ওরফে পি, সন্তানের জন্য c)। COUNT(c.id) ব্যবহার করুন, COUNT(*) নয়, শিশু ছাড়া মূলে 0 পেতে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ