এসকিউএল সার্ভারে বাম যোগদান এবং ডান যোগদানের মধ্যে পার্থক্য


225

আমি এসকিউএল সার্ভারে যোগদান সম্পর্কে জানি।

উদাহরণ স্বরূপ. টেবিল 1, টেবিল 2 দুটি সারণী রয়েছে।

তাদের টেবিল কাঠামো নিম্নলিখিত।

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

টেবিল 1 ডাটা নীচে:

    Id     Name     
    -------------
    1      A        
    2      B    

টেবিল 2 ডেটা নীচে:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

যদি আমি নীচে উল্লিখিত এসকিউএল বিবৃতি দুটি কার্যকর করি তবে উভয় আউটপুট একই হবে

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

উপরের এসকিউএল স্টেটমেন্টগুলিতে বাম এবং ডান যোগদানের মধ্যে পার্থক্যটি ব্যাখ্যা করুন।

উত্তর:


73
Select * from Table1 left join Table2 ...

এবং

Select * from Table2 right join Table1 ...

প্রকৃতপক্ষে সম্পূর্ণরূপে বিনিময়যোগ্য। তবে Table2 left join Table1(বা এর অনুরূপ জুটি Table1 right join Table2) চেষ্টা করুন একটি পার্থক্য দেখতে। এই কোয়েরিতে আপনাকে আরও সারি দেওয়া উচিত, যেহেতু টেবিল 2 এ একটি আইডি সহ একটি সারি রয়েছে যা টেবিল 1 এ উপস্থিত নেই।


17
সুতরাং আমরা কেন প্রয়োজন RIGHT JOINযদি আমরা ন্যায়সঙ্গতভাবে কোনও পছন্দসই ফলাফল অর্জন করতে পারি LEFT JOIN? : পি
ব্যবহারকারী 1857492

1
@ সিলাপআলিয়েভ এটি আসলে একটি খুব ভাল প্রশ্ন। কেউ কি উত্তর দিতে পারে? : ডি
আয়ান চু তে

21
Select * from Table1 left join Table 2সারণী 1 এর Select * from Table1 right join Table 2সমস্ত রেকর্ড এবং আরও সারণী 2 এর কাকতালীয় রেকর্ড ফিরিয়ে দেবে বিপরীতে সারণী 2 থেকে সমস্ত রেকর্ড এবং টেবিল 1 এর কাকতালীয় রেকর্ড ফিরিয়ে আনবে H
প্রোগ্র্যামাদর আডাগাল

3
যদি আপনি আরও দুটি টেবিল ব্যবহার করেন তবে ডান
জোড়

1
@ মারকাসমেস্কেনেন আপনি 7 টি শব্দের একটি সহজ বাক্য পরিবর্তন করছেন। যখন আপনার একাধিক সাবসেন্টেন্স সহ একটি 356 লাইনের বাক্য রয়েছে এবং বাম রাইটের যুক্তিটি পরিবর্তন করতে হবে আপনি কেবলমাত্র একক শব্দ দিয়ে এটি পরিবর্তন করার জন্য আশ্চর্য হবেন ...
প্রগ্রেমাদর অ্যাডাগাল

1014

কোডপ্রজেক্টে এই চিত্রটি রয়েছে যা এসকিউএল যোগদানের সরল বেসিকগুলি ব্যাখ্যা করে: http://www.codeproject.com/KB/datedia/Visual_SQL_Joins.aspx থেকে নেওয়া এসকিউএল যোগদান করে


64
সেখানে 'ডিটেল' তেমন কিছু নেই। ক্রেডিট আসলে আমার পরিবর্তে কোডপোজেক্ট পৃষ্ঠায় যেতে হবে। তবে আমি অবশ্যই তাতে মনোযোগ দিচ্ছি না :-)
দান টিমমার

6
@ দান টিমার না, আপনারও অবশ্যই ক্রেডিট থাকতে হবে! আপনি একটি নির্দিষ্ট এবং নির্দিষ্ট চাহিদা পূরণের জন্য পুনঃস্থাপন এবং পুনরায় বিক্রয়। খুচরা বিক্রেতারাও একই কাজ করে এবং বিলিয়ন ডলার পান
বিকেএসপুরজন

আমি অনুভব করি আমাদের "ও" শর্তের প্রয়োজন হতে পারে যেখানে "আউটটার বাদে যোগ যোগ করুন" এর শেষ চিত্রের ধারা রয়েছে। আমি ক্যোয়ারী চাহিদা নির্বাচন করতে আপডেট করা বোধ <select_list> Table_A একটি পূর্ণ বাহ্য থেকে A.Key = B.Key Table_B বি JOIN কোথায় A.Key আইএস শূন্য এবং B.Key নাল
vinsinraw

@ Vinsinraw- এর প্রয়োজন নেই। কারণ ইতিমধ্যে শর্ত দ্বারা আচ্ছাদিত হয়: JOIN Table_B b ON A.Key = B.Key। ওআর শর্তটি ঠিক কাজ করে।
দান টিমারের

এটি ভেন চিত্রের একটি সাধারণ আপত্তি abuse চেনাশোনা A এবং B সারণি A এবং B কে উপস্থাপন করে না , চেনাশোনা A হ'ল বাম যোগ B এবং Cirlce B একটি সঠিক যোগ B R এছাড়াও অন শর্তটি কী কী তা অপ্রাসঙ্গিক এবং এখানে প্রতিটি কাজ করে না তা বিবেচ্য নয় every কেস। আমার মন্তব্য ও উত্তর দেখুন এই পৃষ্ঠাতে & এই বিভাগে পুনরায় ভেন চিত্র
ফিলিপ্সি

37

আপনি যে টেবিল থেকে ডেটা নিচ্ছেন তা হ'ল 'বাম'।
আপনি যে সারণীতে যোগ দিচ্ছেন তা হ'ল 'রাইট'।
বাম যোগদান: বাম টেবিল থেকে সমস্ত আইটেম নিন এবং (কেবল) ডান টেবিল থেকে আইটেম মেলে।
ডানদিকে যোগ দিন: বাম টেবিল থেকে ডান টেবিল এবং (কেবলমাত্র) মেলানো আইটেম থেকে সমস্ত আইটেম নিন।
তাই:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

দেয়:

Id     Name       
-------------  
1      A          
2      B      

কিন্তু:

Select * from Table1 right join Table2 on Table1.id = Table2.id

দেয়:

Id     Name       
-------------  
1      A          
2      B   
3      C  

আপনি আরও সারি সহ টেবিলে কম সারি যুক্ত টেবিলে ডান যোগদান করছিলেন
এবং
আবার, আরও সারি সহ টেবিলে কম সারি সহ বামে যোগদানের টেবিলটি
চেষ্টা করুন:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(ভেতরের যোগ দিতে: উভয় টেবিলের সাথে মানগুলির মিল রয়েছে এমন রেকর্ডগুলি দেয়।

বাম (আউটার) যোগ দিন: বাম টেবিল থেকে সমস্ত রেকর্ড এবং ডান টেবিল থেকে ম্যাচ করা রেকর্ডগুলি ফিরিয়ে দিন।

ডান (বাইরে) যোগদান: ডান টেবিল থেকে সমস্ত রেকর্ড এবং বাম টেবিল থেকে ম্যাচ করা রেকর্ডগুলি ফিরিয়ে দিন।

সম্পূর্ণ (বাহ্যিক) যোগদান: বাম বা ডান টেবিলের মধ্যে কোনও ম্যাচ থাকলে সমস্ত রেকর্ড

উদাহরণস্বরূপ, ধরা যাক আমাদের নীচে রেকর্ড সহ দুটি টেবিল রয়েছে:

টেবিল এ

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

টেবিল বি

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

ভেতরের যোগ দিতে

দ্রষ্টব্য: এটি দুটি টেবিলের ছেদ দেয়।

ভেতরের যোগ দিতে

বাক্য গঠন

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

আপনার নমুনা সারণিতে এটি প্রয়োগ করুন:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

ফলাফলগুলি হ'ল:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

বাম যোগ দিন

দ্রষ্টব্য: টেবিলএ-তে নির্বাচিত সমস্ত সারি এবং আরও সারণীবিতে সাধারণ নির্বাচিত সারি দেবে।

বাম যোগ দিন

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

এটি আপনার নমুনা সারণিতে প্রয়োগ করুন

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

ফলাফলগুলি হ'ল:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

ডান যোগদান

দ্রষ্টব্য: টেবিলবিতে নির্বাচিত সমস্ত সারি এবং আরও সাধারণ নির্বাচিত সারিগুলি টেবিলএতে দেবে।

ডান যোগদান

বাক্য গঠন:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

এটি আপনার সমোল টেবিলটিতে প্রয়োগ করুন:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

ফলাফল বিডব্লিউ করবে:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

সম্পূর্ণ যোগদান

দ্রষ্টব্য: এটি ইউনিয়ন পরিচালনা হিসাবে একই, এটি উভয় টেবিল থেকে সমস্ত নির্বাচিত মান প্রদান করবে।

সম্পূর্ণ যোগদান

বাক্য গঠন:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

এটি আপনার স্যাম্পে [লে টেবিলে প্রয়োগ করুন:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

ফলাফলগুলি হ'ল:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

কিছু ঘটনা

INNER অর্ডারে যোগদানের জন্য কোনও ব্যাপার নয়

(বাম, সঠিক বা পুরো) জন্য আউটারের সাথে যোগ দেয়, অর্ডার বিষয়টি

W3schools এ আরও সন্ধান করুন


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

fromএই উদাহরণে থাকা সারণীটি tableAসম্পর্কের বাম দিকে রয়েছে।

tableA <- tableB
[left]------[right]

সুতরাং, যদি আপনি tableAডান টেবিলের ( tableB) মেল না থাকে, এমনকি বাম টেবিল ( ) থেকে সমস্ত সারি নিতে চান তবে আপনি "বাম যোগ" ব্যবহার করবেন।

এবং যদি আপনি ডান টেবিল থেকে সমস্ত সারি নিতে চান ( tableB), বাম টেবিলে কোনও মিল না থাকলেও ( tableA), আপনি এটি ব্যবহার করবেনright join

সুতরাং, নিম্নলিখিত কোয়েরি উপরে ব্যবহৃত সমতুল্য।

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

আপনি জিজ্ঞাসা করছেন বলে মনে হচ্ছে, "আমি যদি একটি সিনট্যাক্স RIGHT OUTER JOINব্যবহার LEFT OUTER JOINকরে আবার লিখতে পারি তবে কেন একটি RIGHT OUTER JOINসিনট্যাক্স আদৌ আছে?" আমি মনে করি এই প্রশ্নের উত্তরটি হ'ল, কারণ ভাষার ডিজাইনাররা ব্যবহারকারীদের উপর এ জাতীয় বিধিনিষেধ রাখতে চাননি (এবং আমি মনে করি তারা যদি তা করে তবে তাদের সমালোচনা করা হত), যা ব্যবহারকারীদের সারণির ক্রম পরিবর্তন করতে বাধ্য করবে মধ্যে FROMকিছু পরিস্থিতিতে দফা যখন নিছক টাইপ যোগদানের পরিবর্তন।


কখনও কখনও বাম এবং ডান বাহিরের যোগগুলি পুরোপুরি বিনিময়যোগ্য, সঠিক?
ア レ ッ ク

4
@ অ্যালেক্স: প্রকৃতপক্ষে বাম এবং ডান বহিরাগত যোগদানগুলি সর্বদা বিনিময়যোগ্য।
onedaywhen

8

আপনার দুটি বক্তব্য সমতুল্য।

বেশিরভাগ লোকেরা কেবল LEFT JOINএটি ব্যবহার করেন যেহেতু এটি আরও স্বজ্ঞাত বলে মনে হয় এবং এটি সর্বজনীন বাক্য গঠন - আমি মনে করি না যে সমস্ত আরডিবিএমএস সমর্থন করে RIGHT JOIN


"আমি মনে করি না যে সমস্ত আরডিবিএমএস সঠিক জোটকে সমর্থন করে" - নিশ্চিত, সমস্ত আরডিবিএমএস এসকিউএল সমর্থন করে না। তবে আপনি যদি বোঝাচ্ছেন যে কয়েকটি এসকিউএল পণ্য সমর্থন করে LEFTতবে না RIGHTতবে দয়া করে কোনটি নির্দেশ করুন।
onedaywhen

10
@ মাউন্টেউহেন উদাহরণস্বরূপ, এসকিউএলাইট 3 প্রয়োগ করে না RIGHTএবং FULL OUTER JOIN : sqlite.org/omitted.html
ম্যাক_কেন

0

আমি অনুভব করি যে আমাদের শেষ অঙ্কের ANDশর্তে শর্তের প্রয়োজন হতে পারে যাতে আমরা কাঙ্ক্ষিত ফলাফল পেতে পারি । আমার মনে হয় ক্যোয়ারিতে আপডেট হওয়া দরকারwhereOuter Excluding JOINA Union B Minus A Interaction B

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

আমরা যদি ব্যবহার করি ORতবে আমরা এর ফলাফলগুলি পেয়ে যাবA Union B


0

টেবিল 1 বাম থেকে * নির্বাচন করুন টেবিল 1 এ টেবিল 2 এ যোগ করুন টেবিল 1.id = টেবিল 2.id

প্রথম ক্যোয়ারীতে বাম যোগদানের তুলনা বাঁ-পার্শ্বযুক্ত টেবিল table1 করার অধিকার একতরফা টেবিল table2

যেখানে সমস্ত বৈশিষ্ট্য table1 , দেখানো হবে যেহেতু মধ্যে table2 কেবলমাত্র সেই বৈশিষ্ট্য যা শর্ত সত্য পেতে দেখানো হবে।

টেবিল 2 থেকে * ডান টেবিল 1 এ টেবিল 1 এ টেবিল 1 এ আইডিতে নির্বাচন করুন

প্রথম ক্যোয়ারীতে রাইট যোগদানের তুলনা ডান-পার্শ্বযুক্ত টেবিল table1 করতে বাম-পার্শ্বযুক্ত টেবিল table2

যেখানে সমস্ত বৈশিষ্ট্য table1 , দেখানো হবে যেহেতু মধ্যে table2 কেবলমাত্র সেই বৈশিষ্ট্য যা শর্ত সত্য পেতে দেখানো হবে।

উভয় প্রশ্নের একই ফলাফল দেব কারণ ক্যোয়ারীতে টেবিল ঘোষণা ক্রম ভিন্ন মত আপনি বর্ণনা করে table1 এবং table2 মধ্যে বাম এবং ডান যথাক্রমে প্রথম বাম যোগদানের ক্যোয়ারী, এবং এছাড়াও প্রকাশক table1 এবং table2 মধ্যে ডান এবং বাম যথাক্রমে দ্বিতীয় ডান যোগদানের প্রশ্ন.

এই কারণেই আপনি উভয় প্রশ্নের ক্ষেত্রে একই ফলাফল পাচ্ছেন। সুতরাং আপনি যদি আলাদা ফলাফল চান তবে যথাক্রমে এই দুটি ক্যুরিয়াস চালান,

টেবিল 1 বাম থেকে * নির্বাচন করুন টেবিল 1 এ টেবিল 2 এ যোগ করুন টেবিল 1.id = টেবিল 2.id

টেবিল 1 থেকে ডান টেবিল 1 এ টেবিল 1 এ আইডি 2 তে নির্বাচন করুন


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id সংজ্ঞা অনুসারে: বাম যোগ দিন সারণি 1 থেকে "নির্বাচন করুন" কীওয়ার্ড এবং টেবিল 2 থেকে কলামগুলি উল্লিখিত সমস্ত কলাম নির্বাচন করে যা "অন" কীওয়ার্ডের পরে মানদণ্ডের সাথে মেলে।

একইভাবে, সংজ্ঞা অনুসারে: ডান জোড় টেবিল 2 থেকে "নির্বাচন করুন" কীওয়ার্ড এবং টেবিল 1 থেকে কলামগুলি উল্লিখিত সমস্ত কলাম নির্বাচন করে যা "অন" কীওয়ার্ডের পরে মানদণ্ডের সাথে মেলে।

আপনার প্রশ্নের উল্লেখ করে, উভয় টেবিলের মধ্যে আইডি এর আউটপুটে ফেলে দেওয়া সমস্ত কলামের সাথে তুলনা করা হচ্ছে। সুতরাং, উভয় টেবিলগুলিতে আইডিস 1 এবং 2 সাধারণ এবং ফলস্বরূপ আপনার প্রথম এবং দ্বিতীয় সারণী থেকে আইডি এবং নাম কলাম সহ চারটি কলাম থাকবে ।

*select * from Table1 left join Table2 on Table1.id = Table2.id

উপরের এক্সপ্রেশনটি, এটি টেবিল 1 এবং সারণী 2 থেকে টেবিল 2 থেকে আইডি এর সাথে টেবিল 1 এবং কলামগুলি থেকে সমস্ত রেকর্ড (সারি) নেয় ।

select * from Table2 right join Table1 on Table1.id = Table2.id**

একইভাবে উপরের অভিব্যক্তিটি থেকে, এটি টেবিল 1 এবং সারণী 2 থেকে টেবিল 2 থেকে আইডি এর সাথে টেবিল 1 এবং কলামগুলি থেকে সমস্ত রেকর্ড (সারি) লাগে ( টেবিল 1 থেকে বিবেচনা করা হবে)।

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