আমি স্ব-যোগদানের প্রয়োজন বুঝতে পারি না। কেউ দয়া করে আমাকে সেগুলি ব্যাখ্যা করতে পারেন?
একটি সাধারণ উদাহরণ খুব সহায়ক হবে।
আমি স্ব-যোগদানের প্রয়োজন বুঝতে পারি না। কেউ দয়া করে আমাকে সেগুলি ব্যাখ্যা করতে পারেন?
একটি সাধারণ উদাহরণ খুব সহায়ক হবে।
উত্তর:
আপনি দুটি স্বতন্ত্র টেবিল হিসাবে স্ব-যোগদান দেখতে পারেন। তবে সাধারণকরণে, আপনি টেবিলের দুটি অনুলিপি তৈরি করতে পারবেন না যাতে আপনি কেবল স্ব-যোগদানের সাথে দুটি টেবিল থাকার অনুকরণ করুন।
ধরুন আপনার কাছে দুটি টেবিল রয়েছে:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
এখন, আপনি যদি প্রতিটি কর্মচারীর নাম তার বা তার নাম সহ পেতে চান:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
যা নিম্নলিখিত টেবিলে আউটপুট দেবে:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
left join
আমার মনে হয় যে কোনও কর্মচারী (বা বস) না থাকে যার মনিব নেই out শীর্ষ কুকুর!
আপনার কাছে এমন একটি টেবিল থাকে যা উল্লেখ করে It's উদাহরণ: একটি কর্মচারী টেবিল যেখানে প্রতিটি কর্মচারীর একজন পরিচালক থাকতে পারে এবং আপনি সমস্ত কর্মচারী এবং তাদের পরিচালকের নাম তালিকাভুক্ত করতে চান।
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
একটি স্ব জোড় নিজের সাথে একটি টেবিলের যোগদান।
একটি সাধারণ ব্যবহারের ক্ষেত্রে হ'ল টেবিলে সত্তা (রেকর্ড) সংরক্ষণ করে যাগুলির মধ্যে একটি শ্রেণিবদ্ধ সম্পর্ক রয়েছে । উদাহরণস্বরূপ ব্যক্তির তথ্য (নাম, ডিওবি, ঠিকানা ...) সম্বলিত একটি সারণী এবং একটি কলাম সহ যেখানে পিতার আইডি (এবং / বা মায়ের) অন্তর্ভুক্ত রয়েছে। তারপরে একটি ছোট কোয়েরির মতো
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
আমরা একই ক্যোয়ারিতে শিশু এবং পিতা উভয় (এবং মা, একটি দ্বিতীয় স্ব যোগদানের সাথে এবং এমনকি পিতামহ ইত্যাদি ...) সম্পর্কে তথ্য পেতে পারি।
ধরা যাক আপনার একটি টেবিল রয়েছে users
, এটির মতো সেট আপ করুন:
এই পরিস্থিতিতে যদি আপনি একটি ক্যোয়ারিতে ব্যবহারকারীর তথ্য এবং পরিচালকের তথ্য উভয়ই টানতে চান তবে আপনি এটি করতে পারেন :
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
আপনার টেবিলটি স্ব-রেফারেন্সিয়াল হলে সেগুলি কার্যকর useful উদাহরণস্বরূপ, পৃষ্ঠাগুলির টেবিলের জন্য, প্রতিটি পৃষ্ঠায় একটি next
এবং previous
লিঙ্ক থাকতে পারে । এগুলি একই টেবিলের অন্যান্য পৃষ্ঠাগুলির আইডি হবে। যদি কোনও পর্যায়ে আপনি ধারাবাহিক পৃষ্ঠাগুলির একটি ট্রিপল পেতে চান, আপনি একই টেবিলের কলামটিতে next
এবং previous
কলামগুলিতে দুটি স্ব-যোগদান করতে চাইবেন id
।
Employee
নীচে বর্ণিত হিসাবে বলা একটি টেবিল কল্পনা করুন । সমস্ত কর্মচারীর একজন ম্যানেজার থাকে যা একজন কর্মচারীও (সম্ভবত সিইও ব্যতীত, যার ম্যানেজার_আইডি বাতিল হবে)
Table (Employee):
int id,
varchar name,
int manager_id
তারপরে আপনি সমস্ত কর্মচারী এবং তাদের পরিচালকদের সন্ধান করতে নিম্নলিখিত নির্বাচনগুলি ব্যবহার করতে পারেন:
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
কোনও টেবিলের নিজেকে উল্লেখ করার ক্ষমতা ছাড়াই, আমাদের স্তরক্রমের স্তরগুলির সংখ্যা অনুসারে স্তরের স্তরের জন্য অনেকগুলি সারণী তৈরি করতে হবে। তবে যেহেতু কার্যকারিতাটি উপলভ্য, আপনি টেবিলটি নিজেই যুক্ত হন এবং এসকিএল এটিকে দুটি পৃথক টেবিল হিসাবে বিবেচনা করে, তাই সবকিছু এক জায়গায় দুর্দান্তভাবে সংরক্ষণ করা হয়।
উপরে উল্লিখিত উত্তরগুলি (যা খুব ভালভাবে ব্যাখ্যা করা হয়েছে) বাদে আমি একটি উদাহরণ যুক্ত করতে চাই যাতে সেলফ জয়েনের ব্যবহার সহজেই প্রদর্শিত হতে পারে। ধরুন আপনার কাছে গ্রাহকগণ নামে একটি সারণী রয়েছে যার মধ্যে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে: গ্রাহকআইডি, গ্রাহক নাম, যোগাযোগ নাম, শহর, দেশ। এখন আপনি যারা "একই শহর" থেকে আছেন তাদের সকলের তালিকা করতে চান। আপনাকে এই টেবিলটির একটি প্রতিলিপি ভাবতে হবে যাতে আমরা CITY এর ভিত্তিতে তাদের সাথে যোগ দিতে পারি। নীচের ক্যোয়ারীটি এর অর্থ কী তা স্পষ্টভাবে দেখাবে:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2,
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
এখানে অনেকগুলি সঠিক উত্তর রয়েছে তবে এখানে একটি ভিন্নতা রয়েছে যা সমানভাবে সঠিক। আপনি আপনার যোগদানের শর্তাদি WHOE শর্তের পরিবর্তে যোগদানের বিবৃতিতে রাখতে পারেন।
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
মনে রাখবেন কখনও কখনও আপনি e1.manager_id> e2.id চান
উভয় পরিস্থিতি জানার সুবিধা হ'ল কখনও কখনও আপনার কাছে প্রচুর পরিমাণে বা যোগদানের শর্ত থাকে এবং আপনি নিজের কোডটি পাঠযোগ্য রাখার জন্য অন্য দফায় নিজের স্ব যোগদানের শর্ত রাখতে চান।
যখন কোনও কর্মচারীর ম্যানেজার না থাকে তখন কী ঘটে সে বিষয়ে কেউই সম্বোধন করেনি। হাহ? তারা ফলাফল সেট অন্তর্ভুক্ত করা হয় না। আপনি যদি এমন কোনও কর্মচারী অন্তর্ভুক্ত করতে চান যেখানে ম্যানেজার নেই তবে আপনি ভুল সংমিশ্রণ ফেরত চান না?
এই কুকুরছানা চেষ্টা করুন;
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2
ON e1.emp_id = e2.emp_id
AND e1.emp_name = e2.emp_name
AND e1.every_other_matching_column = e2.every_other_matching_column
একটি ব্যবহারের ক্ষেত্রে একটি ডাটাবেসে সদৃশ রেকর্ডের জন্য পরীক্ষা করা হচ্ছে।
SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
যখন আপনাকে নিজের সাথে টেবিলের ডেটা মূল্যায়ন করতে হয় তখন স্ব-যোগদান কার্যকর হয়। যার অর্থ এটি একই টেবিল থেকে সারিগুলি সম্পর্কযুক্ত করবে।
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
উদাহরণস্বরূপ, আমরা সেই কর্মচারীদের নাম খুঁজে পেতে চাই যাদের প্রাথমিক পদবী বর্তমান পদবী হিসাবে সমান। আমরা নিম্নলিখিত পদ্ধতিতে স্ব যোগদানের ব্যবহার করে এটি সমাধান করতে পারি।
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
এটি একটি লিঙ্কযুক্ত তালিকা / গাছের সমতুল্য ডাটাবেস, যেখানে একটি সারিতে অন্য সারিতে কিছু ক্ষমতার একটি রেফারেন্স থাকে।
সাধারণ ব্যক্তির পদে স্ব-যোগদানের এক্সপ্ল্যানেশন এখানে। স্ব-যোগদানের যোগ কোনও আলাদা ধরণের নয়। আপনি যদি অন্য ধরণের যোগদানের বিষয়টি বুঝতে পারেন (অভ্যন্তরীণ, আউটার এবং ক্রস যোগ দেয়), তবে স্ব স্ব যোগদানটি সরাসরি এগিয়ে হওয়া উচিত। ইনার, আউটার এবং ক্রস যোগগুলিতে, আপনি ২ বা আরও বেশি পৃথক সারণিতে যোগদান করুন। যাইহোক, স্বযুক্তিতে আপনি এর লেবেল সহ একই টেবিলে যোগ দিন। এখানে, আমাদের কাছে 2 টি আলাদা আলাদা টেবিল নেই, তবে একই টেবিলটিকে টেবিলের নাম ব্যবহার করে আলাদা টেবিল হিসাবে ব্যবহার করুন। যদি এটি এখনও স্পষ্ট না হয়, তবে আমি নীচের ইউটিউব ভিডিওগুলি দেখার জন্য পুনরায় সংশোধন করব।