আত্ম-যোগদানের ব্যাখ্যা


87

আমি স্ব-যোগদানের প্রয়োজন বুঝতে পারি না। কেউ দয়া করে আমাকে সেগুলি ব্যাখ্যা করতে পারেন?

একটি সাধারণ উদাহরণ খুব সহায়ক হবে।

উত্তর:


99

আপনি দুটি স্বতন্ত্র টেবিল হিসাবে স্ব-যোগদান দেখতে পারেন। তবে সাধারণকরণে, আপনি টেবিলের দুটি অনুলিপি তৈরি করতে পারবেন না যাতে আপনি কেবল স্ব-যোগদানের সাথে দুটি টেবিল থাকার অনুকরণ করুন।

ধরুন আপনার কাছে দুটি টেবিল রয়েছে:

টেবিল 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

4
এই উদাহরণে, আমি মনিব কে তা বুঝতে পারি না। যদিও এক্সপ্রেসটি ভাল এবং সহজে বোঝা যায়।
ম্যাক

4
left joinআমার মনে হয় যে কোনও কর্মচারী (বা বস) না থাকে যার মনিব নেই out শীর্ষ কুকুর!
রকিন

এটি এমপ সি 1 এর পরিবর্তে এম 1 সি হতে হবে? @ পয়েন্টহীন রাজনীতি
রোহিত সিং

22

আপনার কাছে এমন একটি টেবিল থাকে যা উল্লেখ করে It's উদাহরণ: একটি কর্মচারী টেবিল যেখানে প্রতিটি কর্মচারীর একজন পরিচালক থাকতে পারে এবং আপনি সমস্ত কর্মচারী এবং তাদের পরিচালকের নাম তালিকাভুক্ত করতে চান।

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id

18

একটি স্ব জোড় নিজের সাথে একটি টেবিলের যোগদান।

একটি সাধারণ ব্যবহারের ক্ষেত্রে হ'ল টেবিলে সত্তা (রেকর্ড) সংরক্ষণ করে যাগুলির মধ্যে একটি শ্রেণিবদ্ধ সম্পর্ক রয়েছে । উদাহরণস্বরূপ ব্যক্তির তথ্য (নাম, ডিওবি, ঠিকানা ...) সম্বলিত একটি সারণী এবং একটি কলাম সহ যেখানে পিতার আইডি (এবং / বা মায়ের) অন্তর্ভুক্ত রয়েছে। তারপরে একটি ছোট কোয়েরির মতো

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

আমরা একই ক্যোয়ারিতে শিশু এবং পিতা উভয় (এবং মা, একটি দ্বিতীয় স্ব যোগদানের সাথে এবং এমনকি পিতামহ ইত্যাদি ...) সম্পর্কে তথ্য পেতে পারি।


5

ধরা যাক আপনার একটি টেবিল রয়েছে 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

4

আপনার টেবিলটি স্ব-রেফারেন্সিয়াল হলে সেগুলি কার্যকর useful উদাহরণস্বরূপ, পৃষ্ঠাগুলির টেবিলের জন্য, প্রতিটি পৃষ্ঠায় একটি nextএবং previousলিঙ্ক থাকতে পারে । এগুলি একই টেবিলের অন্যান্য পৃষ্ঠাগুলির আইডি হবে। যদি কোনও পর্যায়ে আপনি ধারাবাহিক পৃষ্ঠাগুলির একটি ট্রিপল পেতে চান, আপনি একই টেবিলের কলামটিতে nextএবং previousকলামগুলিতে দুটি স্ব-যোগদান করতে চাইবেন id


4

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

4

কোনও টেবিলের নিজেকে উল্লেখ করার ক্ষমতা ছাড়াই, আমাদের স্তরক্রমের স্তরগুলির সংখ্যা অনুসারে স্তরের স্তরের জন্য অনেকগুলি সারণী তৈরি করতে হবে। তবে যেহেতু কার্যকারিতাটি উপলভ্য, আপনি টেবিলটি নিজেই যুক্ত হন এবং এসকিএল এটিকে দুটি পৃথক টেবিল হিসাবে বিবেচনা করে, তাই সবকিছু এক জায়গায় দুর্দান্তভাবে সংরক্ষণ করা হয়।


তবে এখন আপনি (আশাবাদী) বুঝতে পারছেন যদি স্ব-রেফারেন্স উপলব্ধ না হয় তবে কি হবে।
ইউজিন

4

উপরে উল্লিখিত উত্তরগুলি (যা খুব ভালভাবে ব্যাখ্যা করা হয়েছে) বাদে আমি একটি উদাহরণ যুক্ত করতে চাই যাতে সেলফ জয়েনের ব্যবহার সহজেই প্রদর্শিত হতে পারে। ধরুন আপনার কাছে গ্রাহকগণ নামে একটি সারণী রয়েছে যার মধ্যে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে: গ্রাহকআইডি, গ্রাহক নাম, যোগাযোগ নাম, শহর, দেশ। এখন আপনি যারা "একই শহর" থেকে আছেন তাদের সকলের তালিকা করতে চান। আপনাকে এই টেবিলটির একটি প্রতিলিপি ভাবতে হবে যাতে আমরা 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;

4
+1 এই উত্তরটি অত্যন্ত গুরুত্বপূর্ণ কারণ এসও-তে অনেকগুলি এসকিউএল প্রশ্ন রয়েছে যার কাছে উত্তরটি "স্ব স্ব যোগদান" ব্যবহার করুন যা লোকেরা যখন তাদের স্পষ্ট (শ্রেণিবিন্যাসিক) স্বতঃপ্রকাশ না করে তখনই দেখতে পায় না।
জিমিবি

4
এমনকি এটি ডাব্লু 3 স্কুল থেকে কপি পাস্তা, আমি মনে করি উপরের উত্তরটি স্ব-যোগদানের ব্যাখ্যা দেয় না তবে অভ্যন্তরীণ-যোগটি যা আলাদা।
জর্জি কে

3

এখানে অনেকগুলি সঠিক উত্তর রয়েছে তবে এখানে একটি ভিন্নতা রয়েছে যা সমানভাবে সঠিক। আপনি আপনার যোগদানের শর্তাদি 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

4
এইচ এম, কুকুরছানাতে, আপনি কেন "সমান" এর পরিবর্তে "বৃহত্তর" তে যোগ দেবেন?
মার্সেল

4
ওহে. আমি দেখেছি যে কয়েকটি উদাহরণ "FROM xXX, yY WHEE WHEE" এবং কিছু অন্যান্য "FROM xxx JOIN yYY WHEE" ব্যবহার করে। আপনি দয়া করে পার্থক্য ব্যাখ্যা করতে পারেন?
স্ক্যান

@ স্ক্যান এটি সত্যিই ভাল প্রশ্ন। সংক্ষিপ্ত উত্তরটি হ'ল এটি পুরাতন শর্টহ্যান্ড পদ্ধতি এবং হ্রাস করা হবে। আমি এটি দশ + বছর আগে স্কুলে ব্যবহার করেছি এবং এটি ব্যবহারে খুব কমই দেখি। আমি খুঁজে পেতে পারি সবচেয়ে সংক্ষিপ্ত বিবরণ এখানে: bidn.com/blogs/ KathiKellenberger
sql-

1

একটি ব্যবহারের ক্ষেত্রে একটি ডাটাবেসে সদৃশ রেকর্ডের জন্য পরীক্ষা করা হচ্ছে।

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

নকলগুলি খুঁজে পাওয়ার জন্য গ্রুপ এবং একটি হ'ল ধারা ব্যবহার করা আরও দ্রুত। নাম, ইমেল, COUNT ( ) থেকে My_Bookings GROUP নাম অনুসারে নির্বাচন করুন, তারিখ অবধি রয়েছেন COUNT ( )> 1
জর্জ কে

পুনঃটুইট আমি মনে করি এটি কেবল একটি অস্পষ্ট ম্যাচের জন্য প্রয়োজনীয় (ট্রিম (লোয়ার (নাম)) দ্বারা দলবদ্ধকরণের বাইরে) এবং কঠোর সাম্যের জন্য নয়।
মোলোসাস স্পোনডি

1

যখন আপনাকে নিজের সাথে টেবিলের ডেটা মূল্যায়ন করতে হয় তখন স্ব-যোগদান কার্যকর হয়। যার অর্থ এটি একই টেবিল থেকে সারিগুলি সম্পর্কযুক্ত করবে।

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

উদাহরণস্বরূপ, আমরা সেই কর্মচারীদের নাম খুঁজে পেতে চাই যাদের প্রাথমিক পদবী বর্তমান পদবী হিসাবে সমান। আমরা নিম্নলিখিত পদ্ধতিতে স্ব যোগদানের ব্যবহার করে এটি সমাধান করতে পারি।

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId

0

এটি একটি লিঙ্কযুক্ত তালিকা / গাছের সমতুল্য ডাটাবেস, যেখানে একটি সারিতে অন্য সারিতে কিছু ক্ষমতার একটি রেফারেন্স থাকে।


প্রকৃতপক্ষে, একাধিক সারিতে একটি "পিতামাতাকে" রেফারেন্স করতে পারে এটি একটি গাছও হতে পারে, যেমন কর্মচারী-> ম্যানেজারের টোটাল উদাহরণ সহ।
এনভিআরাম

আমি কেবল একটি সাধারণ উপমা চেষ্টা করছিলাম, তবে হ্যাঁ একটি গাছও কাজ করতে পারে।
নিবন্ধিত

-4

সাধারণ ব্যক্তির পদে স্ব-যোগদানের এক্সপ্ল্যানেশন এখানে। স্ব-যোগদানের যোগ কোনও আলাদা ধরণের নয়। আপনি যদি অন্য ধরণের যোগদানের বিষয়টি বুঝতে পারেন (অভ্যন্তরীণ, আউটার এবং ক্রস যোগ দেয়), তবে স্ব স্ব যোগদানটি সরাসরি এগিয়ে হওয়া উচিত। ইনার, আউটার এবং ক্রস যোগগুলিতে, আপনি ২ বা আরও বেশি পৃথক সারণিতে যোগদান করুন। যাইহোক, স্বযুক্তিতে আপনি এর লেবেল সহ একই টেবিলে যোগ দিন। এখানে, আমাদের কাছে 2 টি আলাদা আলাদা টেবিল নেই, তবে একই টেবিলটিকে টেবিলের নাম ব্যবহার করে আলাদা টেবিল হিসাবে ব্যবহার করুন। যদি এটি এখনও স্পষ্ট না হয়, তবে আমি নীচের ইউটিউব ভিডিওগুলি দেখার জন্য পুনরায় সংশোধন করব।

একটি উদাহরণ সহ স্ব যোগদান করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.