ද කොහොමද කරන්නේ LEFT JOIN
, RIGHT JOIN
හා FULL JOIN
ගැලපෙන?
ද කොහොමද කරන්නේ LEFT JOIN
, RIGHT JOIN
හා FULL JOIN
ගැලපෙන?
Answers:
ඔබ අනුපිටපත් නොමැති තීරුවලට සම්බන්ධ වන බව උපකල්පනය කිරීම, එය ඉතා පොදු අවස්ථාවකි:
A සහ B වල අභ්යන්තර සම්බන්ධතාවයක් A ඡේදනය වීමේ ප්රති result ලය ලබා දෙයි, එනම් වෙන් රූප සටහනේ ඡේදනයක අභ්යන්තර කොටස .
A සහ B වල බාහිර සම්බන්ධතාවයක් A සංගමයේ ප්රති results ල ලබා දෙයි, එනම් වෙන් රූප සටහනේ සමිතියේ පිටත කොටස්.
උදාහරණ
ඔබට එක් වගුවක් බැගින් වගු දෙකක් ඇති අතර දත්ත පහත පරිදි වේ යැයි සිතමු.
A B
- -
1 3
2 4
3 5
4 6
(1,2) A ට අද්විතීය වන අතර (3,4) පොදු වන අතර (5,6) B ට අද්විතීය වේ.
අභ්යන්තර සන්ධි
සමාන විමසීම් එකක් භාවිතා කරමින් අභ්යන්තර සම්බන්ධතාවයක් වගු දෙකේ ඡේදනය ලබා දෙයි, එනම් ඒවාට පොදු පේළි දෙකකි.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
වම් පිටත බැඳීම
වම් පිටත සම්බන්ධ වීම මඟින් A හි සියලුම පේළි සහ B හි ඕනෑම පොදු පේළි ලබා දෙනු ඇත.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
දකුණු පිටත බැඳීම
දකුණු පිටත බැඳීම මඟින් B හි සියලුම පේළි සහ A හි ඕනෑම පොදු පේළි ලබා දෙනු ඇත.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
සම්පූර්ණ පිටත බැඳීම
සම්පූර්ණ බාහිර සම්බන්ධතාවයක් මඟින් ඔබට A සහ B ඒකාබද්ධ වේ, එනම් A හි ඇති සියලුම පේළි සහ B හි ඇති සියලුම පේළි. A හි යම් දෙයකට අනුරූපී දත්තයක් B හි නොමැති නම්, B කොටස ශුන්ය වන අතර, අනෙක් අතට.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
වෙන් රූපසටහන් ඇත්තටම මා වෙනුවෙන් එය නොකරයි.
ඔවුන් හරස් සම්බන්ධයක් සහ අභ්යන්තර සම්බන්ධතාවයක් අතර වෙනසක් නොපෙන්වයි, උදාහරණයක් ලෙස, හෝ වඩාත් සාමාන්යයෙන් විවිධ ආකාරයේ එක්වීම් අතර වෙනසක් නොපෙන්වයි හෝ ඒවා ක්රියාත්මක වන්නේ කෙසේද යන්න පිළිබඳ තර්ක කිරීම සඳහා රාමුවක් සපයයි.
තාර්කික සැකසුම අවබෝධ කර ගැනීම සඳහා ආදේශකයක් නොමැති අතර එය කෙසේ හෝ ග්රහණය කර ගැනීම සාපේක්ෂව සරල ය.
on
තැන සූදානම ඇගයීමට එම තබා 1 පියවර සියලුම පේළි එරෙහිව වගන්තියtrue
(සැ.යු: ප්රායෝගිකව විමසුම් ප්රශස්තිකරුවා ඉහත සඳහන් තාර්කික විස්තරයට වඩා විමසුම ක්රියාත්මක කිරීමට වඩා කාර්යක්ෂම ක්රම සොයා ගත හැකි නමුත් අවසාන ප්රති result ලය සමාන විය යුතුය)
මම සම්පූර්ණ බාහිර සම්බන්ධතාවයේ සජීවිකරණ අනුවාදයකින් ආරම්භ කරමි . වැඩිදුර පැහැදිලි කිරීම පහත දැක්වේ.
ප්රභව වගු
පළමුව CROSS JOIN
(AKA කාටිසියානු නිෂ්පාදනයක්) සමඟ ආරම්භ කරන්න . මෙය ON
වගන්තියක් නොමැති අතර වගු දෙකෙන් සෑම පේළි සංයෝජනයක්ම ආපසු ලබා දෙයි.
කුරුස බැඳීමකින් A. වර්ණ, B.Colour තෝරන්න B.
අභ්යන්තර සහ පිටත එක්වීම් වලට "ඔන්" වගන්තියක් ඇත.
A.Colour, B.Colour තෝරාගන්න අභ්යන්තරයෙන් එක්වන්න A.Colour = B.Colour
ඉහත දැක්වෙන්නේ සම්භාව්ය සමානාත්මතාවයයි.
අභ්යන්තර සම්බන්ධ වීමේ කොන්දේසිය අනිවාර්යයෙන්ම සමානාත්මතා තත්වයක් නොවිය යුතු අතර එයට වගු දෙකෙන්ම (හෝ එක්කෝ) තීරු යොමු කිරීම අවශ්ය නොවේ. A.Colour NOT IN ('Green','Blue')
කුරුසයේ එක් එක් පේළිය ඇගයීම මඟින් ප්රතිලාභ ලැබේ.
1 = 1 හි අභ්යන්තර සම්බන්ධතාවයකින් A. වර්ණ, B.Colour තෝරන්න
සම්බන්ධ වීමේ කොන්දේසිය හරස් සම්බන්ධ වීමේ ප්රති result ලයේ සියලුම පේළි සඳහා සත්ය ලෙස තක්සේරු කරයි, එබැවින් මෙය හරස් සම්බන්ධතාවයට සමාන වේ. පේළි 16 හි පින්තූරය මම නැවත නොකරමි.
වම් මේසයේ සිට පේළියක් (වම් සම්බන්ධතාවයක් සඳහා) දකුණු අතේ මේසයේ සිට කිසිදු පේළියක් සමඟ සම්බන්ධ නොවන්නේ නම්, එහි ප්රති NULL
values ලයක් ලෙස අගයන් සමඟ සංරක්ෂණය කරනු ලැබේ . දකුණු අත තීරු.
මෙය හුදෙක් පෙර ප්රති result ලය සීමා කරන්නේ පේළි නැවත ලබා දීමට පමණි B.Colour IS NULL
. මෙම විශේෂිත අවස්ථාවෙහිදී, මේවා දකුණු අත වගුවේ නොගැලපීමක් ඇති බැවින් සංරක්ෂණය කරන ලද පේළි වන අතර විමසුම මඟින් වගුවේ නොගැලපෙන තනි රතු පේළිය ලබා දෙයි B
. මෙය අර්ධ අර්ධ සම්බන්ධයක් ලෙස හැඳින්වේ.
මෙම රටාව නිවැරදිව ක්රියාත්මක වීම සඳහා IS NULL
කිසියම් NULL
අගයක් බැහැර කරනු ඇති බවට සහතික කිරීමේ පරීක්ෂණයක් සඳහා තීරුවක් තෝරා ගැනීම වැදගත් වන අතර ඒ සඳහා NULL
වටිනාකමක් ඇති පේළි නැවත ගෙන ඒමෙන් වළකින්න. නොගැලපෙන පේළි වලට අමතරව තීරුව.
දකුණු පිටත සන්ධි වම් පිටත සන්ධිවලට සමානව ක්රියා කරයි. ඒවා දකුණු මේසයෙන් නොගැලපෙන පේළි ආරක්ෂා කර වම් අත තීරු විස්තාරණය කරයි.
සම්පූර්ණ පිටත බැඳීම් වම් සහ දකුණ සම්බන්ධතාවයේ හැසිරීම ඒකාබද්ධ කරන අතර වම් සහ දකුණු වගු දෙකෙන්ම නොගැලපෙන පේළි ආරක්ෂා කරයි.
හරස් සම්බන්ධයේ පේළි කිසිවක් 1=0
පුරෝකථනයට නොගැලපේ . දෙපසින් ඇති සියලුම පේළි අනෙක් පැත්තෙන් මේසයේ සිට තීරුවල NULL සමඟ සාමාන්ය පිටත සම්බන්ධ වීමේ නීති භාවිතා කර සංරක්ෂණය කර ඇත.
පෙර විමසුමට සුළු සංශෝධනයක් කිරීමෙන් කෙනෙකුට UNION ALL
වගු දෙකෙන් එකක් අනුකරණය කළ හැකිය .
WHERE
වගන්තිය (තිබේ නම්) සම්බන්ධ වීමෙන් පසුව තාර්කිකව ක්රියාත්මක වන බව සලකන්න . එක් පොදු දෝෂයක් නම් වම් පිටත සම්බන්ධතාවයක් සිදු කර පසුව නොගැලපෙන පේළි බැහැර කර අවසන් වන දකුණු වගුවේ කොන්දේසියක් සහිත WHERE වගන්තියක් ඇතුළත් කිරීමයි. ඉහත දැක්වෙන්නේ පිටත එක්වීමයි ...
... ඊට පස්සෙ "කොහෙද" වගන්තිය ක්රියාත්මක වේ. NULL= 'Green'
සත්ය ලෙස තක්සේරු නොකෙරෙන බැවින් පිටත සන්ධිය මගින් සංරක්ෂණය කර ඇති පේළිය ඉවතලනු ලැබේ (නිල් පාටින්) එකතු වීම effectively ලදායී ලෙස නැවත අභ්යන්තරයට පරිවර්තනය කරයි.
වර්ණය හරිත වන B සිට පේළි පමණක් ඇතුළත් කිරීම සහ A හි සියලුම පේළි නිවැරදි වාක්ය ඛණ්ඩය ඇතුළත් කිරීමට අදහස් කළේ නම්
මෙම උදාහරණ SQLFiddle.com හි සජීවීව ක්රියාත්මක වන ආකාරය බලන්න .
වගු දෙකකින් දත්ත ඒකාබද්ධ කිරීම සඳහා බැඳීම් භාවිතා වන අතර එහි ප්රති result ලය නව තාවකාලික වගුවක් වේ. එක්වීම සිදු කිරීම සඳහා භාවිතා කළ යුතු කොන්දේසිය නියම කරන ප්රෙඩිකේට් යනුවෙන් හැඳින්වෙන දෙයක් මත පදනම්ව බැඳීම් සිදු කරනු ලැබේ. අභ්යන්තර සම්බන්ධතාවයක් සහ බාහිර සම්බන්ධතාවයක් අතර ඇති වෙනස නම්, අභ්යන්තර සම්බන්ධතාවයක් නැවත ලැබෙන්නේ සම්බන්ධ වීමේ පුරෝකථනය මත පදනම්ව සැබවින්ම ගැලපෙන පේළි පමණි. උදා: සේවක සහ ස්ථාන වගුව සලකා බලමු:
අභ්යන්තර සම්බන්ධ වීම: - එක්වීම-පුරෝකථනය මත පදනම්ව වගු දෙකක ( සේවක සහ ස්ථානය )තීරු අගයන් ඒකාබද්ධ කිරීමෙන් අභ්යන්තර බැඳීම නවප්රතිresult ල වගුවක් නිර්මාණයකරයි. විමසුම සේවක පේළිය එක් එක් ස්ථානය පේළිය සමඟසංසන්දනයකර එක්වන අනාවැකිය තෘප්තිමත් කරන සියලු පේළි යුගල සොයා ගනී. NULL නොවන අගයන් ගැලපීමෙන් සම්බන්ධ වීමේ පුරෝකථනය සෑහීමකට පත්වන විට, ගැලපෙන එක් එක් පේළි යුගල සඳහා තීරු අගයන් සේවක හා ස්ථානය ප්රතිඵලයක් පේළිය බවට සංකලනය වී ඇත. අභ්යන්තර සම්බන්ධතාවයක් සඳහා වන SQL පෙනුම කෙබඳුදැයි මෙන්න:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
දැන්, SQL ධාවනය කිරීමේ ප්රති result ලය කෙබඳුදැයි මෙන්න:
පිටත සම්බන්ධ වීම: - සම්බන්ධ වූ වගු දෙකෙහි එක් එක් වාර්තාවක් ගැලපෙන වාර්තාවක් තිබීම සඳහා බාහිර සම්බන්ධතාවයකට අවශ්ය නොවේ. ගැලපෙන වගුව එක් එක් වාර්තාවක් තබා ගනී other වෙනත් ගැලපෙන වාර්තාවක් නොතිබුණද. පිටත එකතු වන්නේ වම් පිටත සන්ධිවලට සහ දකුණු පිටත සන්ධිවලට ය. එය වගුවේ පේළි රඳවා තබා ගන්නේ (වමේ හෝ දකුණේ) මත ය.
වම් පිටත සම්බන්ධ වීම: - වගු සඳහා වම් පිටත සම්බන්ධතාවයේ (හෝ සරලව වම් සම්බන්ධතාවයේ)ප්රතිresult ලය සේවකයා සහ ස්ථානය සැමවිටම "වම්" වගුවේ ( සේවකයා )සියලුම වාර්තා අඩංගු වේ. "දකුණු" වගුව ( ස්ථානය ). ඉහත වගු භාවිතා කරමින් වම් පිටත සම්බන්ධ වීම සඳහා වන SQL පෙනුම කෙබඳුද යන්න මෙන්න:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
දැන්, මෙම SQL ධාවනය කිරීමේ ප්රති result ලය කෙබඳු වනු ඇත්ද:
දකුණු පිටත එක්වීම : - වගු ආපසු හරවා යැවීම හැරුණු විට දකුණු පිටත බැඳීම (හෝ දකුණට එක්වීම) වම් පිටත සම්බන්ධතාවයට සමීපව සමාන වේ. "දකුණු" වගුවේ ( ස්ථානය )සිට සෑම පේළියක්මඅවම වශයෙන් එක් වරක්වත් සම්බන්ධ වූ වගුවේ දිස්වනු ඇත. "වාම" වගු (කිසිදු ගැලපෙන පේළියේ නම් සේවක ) පවතී, NULL සිට තීරු දිස් වනු ඇත සේවක කිසිදු තරගය ඇති බව එම වාර්තා ස්ථානය . SQL පෙනුම මෙයයි:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
ඉහත වගු භාවිතා කරමින්, දකුණු පිටත සම්බන්ධතාවයේ ප්රති result ල කට්ටලය කෙබඳු වේදැයි අපට පෙන්විය හැකිය:
සම්පුර්ණ පිටත බැඳීම්: - සම්පුර්ණ පිටත බැඳීම හෝ පූර්ණ සම්බන්ධ වීම යනු සම්බන්ධතාවයේ ප්රති results ලවල නොගැලපෙන පේළි ඇතුළත් කිරීමෙන් නොගැලපෙන තොරතුරු රඳවා තබා ගැනීමයි. අනෙක් වගුවට ගැලපෙන අගයක් තිබේද නැද්ද යන්න නොසලකා වගු දෙකේම සියලුම පේළි එයට ඇතුළත් වේ.
ගැලපෙන පේළි පමණක් ලබා ගන්න, එනම් A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
පළමු වගුවෙන් සියලුම වාර්තා තෝරන්න, සහ සම්බන්ධිත යතුරු සමඟ ගැලපෙන දෙවන වගුවේ ඕනෑම වාර්තා තෝරන්න.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
දෙවන වගුවෙන් සියලුම වාර්තා තෝරන්න, සහ සම්බන්ධිත යතුරු සමඟ ගැලපෙන පළමු වගුවේ ඕනෑම වාර්තා තෝරන්න.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
සරල වචන වලින්:
ක අභ්යන්තර එක්වන පමණක් ගැලපෙන පේළි ලබා.
බාහිර සම්බන්ධතාවයක් එක් වගුවකින් ගැලපෙන පේළි සහ අනෙක් වගුවේ ඇති සියලුම පේළි ලබා ගන්නා අතර .... ප්රති result ලය රඳා පවතින්නේ ඔබ භාවිතා කරන්නේ කුමන එක මතද යන්න මත ය:
වමේ : දකුණු වගුවේ පේළි හා වම් මේසයේ ඇති සියලුම පේළි
දකුණ : වම් වගුවේ පේළි හා දකුණු මේසයේ ඇති සියලුම පේළි හෝ
සම්පුර්ණ : සියලුම වගු වල සියලුම පේළි. තරඟයක් තිබේද නැද්ද යන්න ගැටළුවක් නොවේ
අභ්යන්තර සම්බන්ධතාවයක් පේළි පෙන්වන්නේ සම්බන්ධතාවයේ අනෙක් (දකුණු) පැත්තේ ගැලපෙන වාර්තාවක් තිබේ නම් පමණි.
සම්බන්ධතාවයේ අනෙක් (දකුණු) පැත්තේ ගැලපෙන පේළි නොතිබුණද, වම් පස එක් එක් වාර්තාව සඳහා පේළි (වමේ) පිටත සම්බන්ධ කිරීම පෙන්වයි. ගැලපෙන පේළියක් නොමැති නම්, අනෙක් (දකුණු) පැත්තේ ඇති තීරු NULL පෙන්වයි.
සම්බන්ධ වූ වගුවේ අදාළ හැඳුනුම්පතක් සහිත වාර්තාවක් තිබිය යුතුය.
පිටත සම්බන්ධ වීම දකුණු පැත්තට කිසිවක් නොතිබුණද වම් පැත්ත සඳහා වාර්තා ලබා දෙනු ඇත.
උදාහරණයක් ලෙස, ඔබට ඇණවුම් සහ ඇණවුම් විස්තර වගුවක් ඇත. ඒවා "OrderID" මගින් සම්බන්ධ වේ.
නියෝග
ඇණවුම් විස්තර
ඉල්ලීම
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ආපසු එවනු ලබන්නේ ඇණවුම් විස්තර වගුවේ යමක් ඇති ඇණවුම් පමණි.
ඔබ එය OUTER LEFT JOIN ලෙස වෙනස් කළහොත්
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ඕඩර් ඩෙටේල්ස් වාර්තා නොමැති වුවද එය ඇණවුම් වගුවෙන් වාර්තා ලබා දෙනු ඇත.
ඔබට මෙය භාවිතා කළ හැකිය, කිසිදු ඇණවුමක් නොමැති ඇණවුම් සොයා ගැනීමට, අනාථ වූ ඇණවුමක් දැක්වෙන වගන්තියක් වැනි ස්ථානයක් එකතු කිරීමෙන් WHERE OrderDetails.OrderID IS NULL
.
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
කිරීමට SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
සාර්ථක (MySQL). අමතර කොන්දේසි ගැන මට විශ්වාසයක් නොතිබුණි, ඒවා හොඳින් මිශ්ර වේ ...
සරල වචන වලින්:
අභ්යන්තර බැඳීම -> දෙමව්පියන්ගෙන් සහ ළමා වගු වලින් පමණක් පොදු වාර්තා ගන්න දෙමාපිය වගුවේ ප්රාථමික යතුර ගැලපෙන්නේ කොහේද ළමා වගුවේ විදේශ යතුර.
වමට සම්බන්ධ වීම ->
ව්යාජ කේතය
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
දකුණට එක්වීම : වම් සම්බන්ධතාවයට හරියටම ප්රතිවිරුද්ධයයි. මේසයේ නම වම් පසින් දකුණු පසින් දකුණට එක්වන්න, ඔබට LEFT JOIN ලෙස ප්රතිදානය ලැබේ.
පිටත සම්බන්ධ වීම : වගු දෙකේම සියලුම වාර්තා පෙන්වන්නNo matter what
. ප්රාථමික, Forieign යතුර මත පදනම්ව වම් වගුවේ වාර්තා දකුණු වගුවට නොගැලපේ නම්, සම්බන්ධ වීමේ ප්රති N ලයක් ලෙස NULL අගය භාවිතා කරන්න.
උදාහරණයක් :
දැන් වගු 2 ක් සඳහා උපකල්පනය කරමු
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
මෙන්න, සේවක වගුව ප්රධාන වගුව, phone_numbers_employees යනු ළමා වගුවයි ( එහි ළමා වගුව emp_id
සම්බන්ධ කරන විදේශීය යතුරක් ලෙස එය අඩංගු වේ employee.id
.)
ඇතුළත එකතු වේ
වගු 2 ක වාර්තා පමණක් ගන්න සේවක වගුවේ ප්රාථමික යතුර (එහි හැඳුනුම්පත) ගැලපෙන්නේ ළමා වගුවේ විදේශීය යතුර දුරකථන_නම්බර්ස්_එම්ප්ලෝයිස් (emp_id) .
එබැවින් විමසුම වනුයේ:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
ඉහත විස්තර කර ඇති පරිදි ප්රාථමික යතුර = විදේශීය යතුර මත ගැලපෙන පේළි පමණක් ගන්න. ප්රාථමික යතුර හා නොගැලපෙන පේළි මෙහි එක්වීම නිසා විදේශීය යතුර මඟ හැරේ.
වමට සම්බන්ධ වේ :
දකුණු මේසයට ගැලපෙන පේළියක් තිබේද යන්න නොසලකා වම් එක්වීම වම් වගුවේ සියලුම පේළි රඳවා ගනී.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
පිටත සම්බන්ධ වේ :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
රූප සටහන අනුව එය පෙනෙන්නේ:
INNER JOIN
ගැලපීමක් ඇති වගු දෙකෙන්ම සියලු පේළි ආපසු ලබා දීමට ඔබ භාවිතා කරයි. එනම් ප්රති table ලයක් ලෙස ඇති වගුවේ සියලුම පේළි සහ තීරු වල අගයන් ඇත.
දී OUTER JOIN
එහි ප්රතිඵලයක් වගුව හිස් තීරු තිබිය හැක. පිටත බැඳීම එක්කෝ LEFT
හෝ විය හැකිය RIGHT
.
LEFT OUTER JOIN
දෙවන වගුවේ ගැලපීම් නොමැති වුවද පළමු පේළියේ සිට සියලු පේළි ලබා දෙයි.
RIGHT OUTER JOIN
පළමු වගුවේ කිසිදු ගැලපීමක් නොතිබුණද, දෙවන වගුවෙන් සියලුම පේළි ලබා දෙයි.
මෙය සියලු ආකාරයේ බැඳීම් සඳහා හොඳ රූපසටහන් පැහැදිලි කිරීමකි
මූලාශ්රය: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
වගු දෙක සංසන්දනය කිරීමේදී අවම වශයෙන් ගැලපීමක් අවශ්ය වේ. උදාහරණයක් ලෙස, A ٨ B (A ඡේදනය B) යන්නෙන් අඟවන A වගුව සහ වගුව.
LEFT OUTER JOIN
හා LEFT JOIN
සමාන වේ. එය වගු දෙකෙහිම ගැලපෙන සියලුම වාර්තා සහ වම් වගුවේ සියලු හැකියාවන් ලබා දෙයි.
ඒ හා සමානව, RIGHT OUTER JOIN
හා RIGHT JOIN
සමාන වේ. එය වගු දෙකෙහිම ගැලපෙන සියලුම වාර්තා සහ නිවැරදි වගුවේ සියලු හැකියාවන් ලබා දෙයි.
FULL JOIN
යනු අනුපිටපත් LEFT OUTER JOIN
හා RIGHT OUTER JOIN
රහිත සංයෝජනයකි .
පිළිතුර සෑම කෙනෙකුගේම අර්ථයෙන් ඇත, එබැවින් ප්රති .ල වල.
සටහන:
දීSQLite
නැතRIGHT OUTER JOIN
හෝFULL OUTER JOIN
.
ඒ වගේමMySQL
කිසිම දෙයක් නැහැFULL OUTER JOIN
.
මගේ පිළිතුර ඉහත සටහන මත පදනම් වේ .
ඔබට මේ වගේ වගු දෙකක් ඇති විට:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN / OUTER JOIN:
ඔබට එම වගු දත්ත සියල්ලම මේ සමඟ CROSS JOIN
හෝ සමඟ තිබිය ,
හැකිය:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
INNER JOIN: ඔබට භාවිතා කළ හැකි
සම්බන්ධතාවයක් මත පදනම්ව ඉහත ප්රති results ල වලට පෙරනයක් එක් කිරීමට අවශ්ය විට :table1.id = table2.id
INNER JOIN
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
වම් [පිටත] එකතු වන්න:
ඔබ භාවිතා කළ හැකිය එම relation-, මුගුරු ඉහත ප්රතිඵලය ගැන වගු එක් සියලු පේළි ඇති කිරීමට අවශ්ය වූ විට LEFT JOIN
:
සඳහා ( දකුණු එක්වන වගු හුදෙක් වෙනස් ස්ථානය)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
සම්පූර්ණ සම්බන්ධ වීම:
ඔබේ ප්රති results ලවල අනෙක් වගුවේ සියලුම පේළි ලබා ගැනීමට ඔබට අවශ්ය වූ විට ඔබට භාවිතා කළ හැකිය FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
හොඳයි, ඔබේ අවශ්යතාවය පරිදි ඔබේ අවශ්යතාවය ආවරණය වන සෑම එකක්ම තෝරා ගන්න;).
full outer join
MySQL හි ද නොමැති බව ඔබට ඔබේ සටහනට එක් කළ හැකිය.
අභ්යන්තර සන්ධි.
සම්බන්ධ වීම යනු වගු දෙකකින් පේළි ඒකාබද්ධ කිරීමයි. ක අභ්යන්තර එක්වන නිර්ණායක මත පදනම් වූ වගු දෙකක් ඔබ විමසුම දී සඳහන් දක්වා ගැලපෙන උත්සාහයන්, සහ එකම එම තරගයේදී පේළි පැමිණේ. සම්බන්ධතාවයේ පළමු වගුවේ පේළියක් දෙවන වගුවේ පේළි දෙකකට ගැලපේ නම්, ප්රති .ලවල පේළි දෙකක් ආපසු ලැබෙනු ඇත. පළමු වගුවේ පේළියක් දෙවන පේළියට නොගැලපේ නම් එය ආපසු නොලැබේ; ඒ හා සමානව, දෙවන වගුවේ පළමු පේළියට නොගැලපෙන පේළියක් තිබේ නම්, එය ආපසු නොලැබේ.
පිටත බැඳීම.
ඒ සම්බන්ධ ඉතිරි දෙවන වගුවේ පේළි පළමු වගුව සිට පේළි ගලපන්න සොයා ගැනීමට උත්සාහ. එයට ගැලපීමක් සොයාගත නොහැකි නම්, එය පළමු වගුවේ සිට තීරු ආපසු ලබා දෙන අතර දෙවන වගුවේ ඇති තීරු හිස්ව තබයි (ශූන්ය).
INNER JOIN
වගු දෙකක් හෝ වැඩි ගණනක් සඳහා බොහෝ විට සම්බන්ධ වීම. එය ප්රාථමික යතුරු සහ ෆොරින්ග්කි සම්බන්ධතාවය යන දෙකෙහිම දත්ත ගැලපීම ලබා දෙයි.OUTER JOIN
සමාන වේ INNER JOIN
, නමුත් එයට NULL
ResultSet හි දත්තද ඇතුළත් වේ .
LEFT JOIN
= INNER JOIN
+ දකුණු වගුවේ ගැලපීම සමඟ වම් වගුවේ අසමසම දත්ත Null
.RIGHT JOIN
= INNER JOIN
+ වම් මේසයට ගැලපෙන දකුණු වගුවේ අසමසම දත්ත Null
.FULL JOIN
= INNER JOIN
+ ගැලපීම් සහිත දකුණු හා වම් වගු දෙකෙහි අසමසම දත්ත Null
.INNER JOIN
සහ OUTER JOIN
අපට ස්වයං සම්බන්ධ වීමේ විමසුම් ලිවිය හැකිය.උදාහරණයක් වශයෙන්:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
අනෙක් පිළිතුරු වල කාර්ය සාධනය සහ ප්රශස්තකරණය පිළිබඳ වැඩි විස්තර මා දකින්නේ නැත.
සමහර විට එය පමණක් දැන ගැනීම හොඳය INNER JOIN
ඇසෝසියේටිව් එයින් අදහස් කරන්නේ ප්රශස්තකරණයට එය සමඟ සෙල්ලම් කිරීමට වඩාත්ම විකල්පය ඇති බවයි. එකම ප්රති .ලය තබා ගනිමින් එය වේගවත් කිරීම සඳහා සම්බන්ධ වීමේ අනුපිළිවෙල නැවත සකස් කළ හැකිය. ප්රශස්තිකරණයට වඩාත්ම සම්බන්ධ වීමේ ක්රම භාවිතා කළ හැකිය.
සාමාන්යයෙන් INNER JOIN
විවිධ ආකාරයේ බැඳීම් වෙනුවට භාවිතා කිරීමට උත්සාහ කිරීම හොඳ පුරුද්දකි . (ඇත්ත වශයෙන්ම අපේක්ෂිත ප්රති result ල කට්ටලය සලකා බැලීමට හැකි නම්.)
මෙම අමුතු සහායක හැසිරීම ගැන හොඳ උදාහරණ කිහිපයක් සහ පැහැදිලි කිරීමක් මෙහි ඇත:
INNER JOIN
වඩා මන්දගාමී LEFT JOIN
වන අතර අනපේක්ෂිත ප්රති results LEFT JOIN
ල ඉවත් කිරීම සඳහා INNER JOIN
එකතු කිරීම වෙනුවට මිනිසුන්ට භාවිතා කළ හැකිය ;). WHERE
NULL
INNER
මන්දගාමී යැයි ඔබ සිතන්නේ ඇයි ?
බොහෝ සෙයින් ආදරය කරන රතු-සෙවන සහිත වෙන්න් රූප සටහන විවේචනය කිරීමෙන් පසුව, මම සිතුවේ මගේම උත්සාහයක් පළ කිරීම සාධාරණ බවය.
Ar මාටින් ස්මිත්ගේ පිළිතුර බොහෝ දුරට මෙම පොකුරේ හොඳම දේ වුවද, ඔහුගේ එකම වගුවේ එක් එක් වගුවේ ප්රධාන තීරුව පෙන්වන අතර, යතුරු නොවන තීරු ද පෙන්විය යුතු යැයි මම සිතමි.
මම අවසර අර්ධ පැයකින් කළ හැකි හොඳම, මම තවමත් එය ප්රමාණවත් හිතන්නේ නැහැ සංදර්ශන ද nulls ප්රධාන වටිනාකම් නොමැති වීම නිසා ඇති බව TableB
හෝ OUTER JOIN
එක්වන්නේ වඩා ඇත්තටම වෘත්තීය සමිති ය:
TableA a LEFT OUTER JOIN TableB b
TableB B RIGHT OUTER JOIN TableA a
සඳහා නිශ්චිත ඇල්ගොරිතමය INNER JOIN
, LEFT/RIGHT OUTER JOIN
පහත සඳහන් පරිදි වේ:
a
(a, b[i])
ON ...
එක් එක් යුගලයට එරෙහිව වගන්තිය තක්සේරු කරන්න :ON( a, b[i] ) = true/false?
true
, එම ඒකාබද්ධ පේළිය ආපසු එවන්න (a, b[i])
.Outer Join
ආපසු එවන්න:Null
(a, Null)
LEFT පිටත එක්වීම සඳහා හෝ (Null, b)
දකුණු පිටත බැඳීම සඳහා. මෙය පළමු වගුවේ සියලුම පේළි අවසාන ප්රති .ලවල පවතින බව සහතික කිරීමයි.සටහන:ON
වගන්තියේ දක්වා ඇති කොන්දේසිය කිසිවක් විය හැකිය, එය ප්රාථමික යතුරු භාවිතා කිරීම අවශ්ය නොවේ (තවද ඔබට සෑම විටම වගු දෙකෙන්ම තීරු වෙත යොමු වීමට අවශ්ය නොවේ)! උදාහරණයක් වශයෙන්:
... ON T1.title = T2.title AND T1.version < T2.version
(=> නියැදි භාවිතයක් ලෙස මෙම ලිපිය බලන්න: තීරුවක උපරිම අගය සහිත පේළි පමණක් තෝරන්න )... ON T1.y IS NULL
... ON 1 = 0
(නියැදිය මෙන්)සටහන: වම් බැඳීම = වම් පිටත සම්බන්ධ වීම, දකුණට සම්බන්ධ වීම = දකුණු පිටත බැඳීම.
සරලම අර්ථ දැක්වීම්
අභ්යන්තර සම්බන්ධ වීම: වගු දෙකෙන්ම ගැලපෙන වාර්තා ලබා දෙයි.
සම්පූර්ණ පිටත සම්බන්ධ වීම: මේස දෙකෙන්ම අසමසම වාර්තා සඳහා නොගැලපෙන වාර්තා සඳහා වගු දෙකෙන්ම ගැලපෙන හා අසමසම වාර්තා ලබා දෙයි .
වම් පිටත සම්බන්ධ වීම: ගැලපෙන හා අසමසම වාර්තා ලබා දෙන්නේ වම් පැත්තේ ඇති වගුවෙන් පමණි .
දකුණු පිටත එක්වීම: ගැලපෙන හා අසමසම වාර්තා ලබා දෙන්නේ දකුණු පැත්තේ ඇති වගුවෙන් පමණි .
කෙටියෙන්
ගැලපෙන + වම් අසමසම + දකුණ අසමසම = සම්පූර්ණ පිටත සම්බන්ධ වීම
ගැලපෙන + වම් අසමසම = වම් පිටත සම්බන්ධ වීම
ගැලපෙන + දකුණ අසමසම = දකුණු පිටත එක්වීම
ගැලපේ = අභ්යන්තර සම්බන්ධ වීම
සරල කොන්දේසි වලින්,
1. ඉනර් එක්වීම හෝ ඉක්වයින් එක්වීම: වගු දෙකේම තත්වයට පමණක් ගැලපෙන ප්රති set ල කට්ටලය ලබා දෙයි.
2. පිටත බැඳීම: පිටත සම්බන්ධ වීම කොන්දේසි ගැලපීමක් තිබුණත් නැතත් වගු දෙකෙන්ම සියලුම අගයන්ගේ ප්රති set ල ලබා දෙයි.
3. වමට සම්බන්ධ වන්න: වම් වගුව සහ දකුණු වගුවේ තත්ත්වය ගැලපෙන පේළි පමණක් සියලු වටිනාකම් resultset ආයෙත්.
4. නිවැරදි බැඳීම: සියලුම අගයන්හි ප්රති results ල දකුණු වගුවෙන් ලබා දෙන අතර වම් වගුවේ තත්වයට ගැලපෙන පේළි පමණි.
5. පූර්ණ සම්බන්ධ වීම : පූර්ණ සම්බන්ධ වීම සහ සම්පූර්ණ පිටත බැඳීම සමාන වේ.
උදාහරණ
ඔබට එක් වගුවක් බැගින් වගු දෙකක් ඇති අතර දත්ත පහත පරිදි වේ යැයි සිතමු.
A B
- -
1 3
2 4
3 5
4 6
7
8
(1,2,7,8) A ට අද්විතීය වන අතර (3,4) පොදු වන අතර (5,6) B ට අද්විතීය වේ.
INNER JOIN යතුර මඟින් කොන්දේසිය සෑහීමකට පත්වන තාක් කල් වගු දෙකෙන්ම සියලුම පේළි තෝරා ගනී. මෙම පදය මඟින් කොන්දේසිය තෘප්තිමත් වන වගු දෙකේම ඇති සියලුම පේළි ඒකාබද්ධ කිරීමෙන් ප්රති result ල කට්ටලය නිර්මාණය වනු ඇත, එනම් පොදු ක්ෂේත්රයේ අගය සමාන වේ.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
ප්රති ult ලය:
a | b
--+--
3 | 3
4 | 4
මෙම බැඳීම සම්බන්ධතාවයේ වම් පැත්තේ ඇති මේසයේ සියලු පේළි සහ සම්බන්ධතාවයේ දකුණු පැත්තේ මේසය සඳහා ගැලපෙන පේළි ලබා දෙයි. දකුණු පැත්තේ නොගැලපෙන පේළියක් නොමැති පේළි, ප්රති result ල කට්ටලය ශුන්ය වේ. LEFT JOIN ලෙසද හැඳින්වේ LEFT OUTER JOIN
.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
ප්රති ult ලය:
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
7 | null
8 | null
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
ප්රති ult ලය:
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
සම්පූර්ණ (පිටත) එක්වන්න :
FULL JOIN මඟින් LEFT JOIN සහ RIGHT JOIN යන දෙකෙහිම ප්රති result ල ඒකාබද්ධ කිරීමෙන් ප්රති result ල කට්ටලය නිර්මාණය වේ. ප්රති result ල-කට්ටලයට වගු දෙකේම සියලුම පේළි අඩංගු වේ. නොගැලපෙන පේළි, ප්රති result ල-කට්ටලය තුළ NULL අගයන් අඩංගු වේ.
select * from a FULL OUTER JOIN b on a.a = b.b;
ප්රති ult ලය:
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
7 | null
8 | null
අභ්යන්තර බැඳීම - සමාන විමසීම් එකක් භාවිතා කරමින් අභ්යන්තර සම්බන්ධතාවයක් මඟින් වගු දෙකේ ඡේදනය ලබා දෙයි , එනම් ඒවාට පොදු පේළි දෙකකි.
වම් පිටත එක්වීම - වම් පිටත එක්වීම මඟින් A හි සියලුම පේළි සහ B හි ඕනෑම පොදු පේළි ලබා දෙනු ඇත.
සම්පූර්ණ පිටත සම්බන්ධ වීම - පූර්ණ පිටත සම්බන්ධතාවයක් මඟින් ඔබට A සහ B ඒකාබද්ධ වේ, එනම් A හි ඇති සියලුම පේළි සහ B හි ඇති සියලුම පේළි. A හි යම් දෙයක් B හි අනුරූප දත්තයක් නොමැති නම්, B කොටස ශුන්ය, සහ අනෙක් අතට
Join is not an intersection unless the tables have the same columns
ඔබට අවශ්ය ඕනෑම තීරුවකට සම්බන්ධ විය හැකි අතර අගය ගැලපෙන්නේ නම් ඒවා එකට එකතු වේ.
1. අභ්යන්තර බැඳීම: එක්වීම ලෙසද හැඳින්වේ. එය වම් වගුවේ ඇති පේළි නැවත ලබා දෙයි, සහ දකුණු වගුව ගැලපීමක් තිබේ නම් පමණි . එසේ නොමැති නම්, එය ශුන්ය වාර්තා ලබා දෙයි.
උදාහරණයක්:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2. සම්පූර්ණ පිටත බැඳීම: පූර්ණ සම්බන්ධ වීම ලෙසද හැඳින්වේ. එය වම් වගුවේ සහ දකුණු වගුවේ ඇති සියලුම පේළි නැවත ලබා දෙයි .
උදාහරණයක්:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3. වම් පිටත සම්බන්ධ වීම: නැතහොත් සරලව වම් බැඳීම ලෙස හැඳින්වේ. එය වම් වගුවේ ඇති සියලුම පේළි සහ දකුණු වගුවෙන් ගැලපෙන පේළි (ඇත්නම්) ලබා දෙයි.
4. දකුණු පිටත බැඳීම: රයිට් ජොයින් ලෙසද හැඳින්වේ. එය වම් මේසයෙන් ගැලපෙන පේළි (ඇත්නම්) ලබා දෙයි, සහ දකුණු පේළියේ ඇති සියලුම පේළි.
සම්බන්ධ වීමේ වාසි
පහත වගු 2 ක් සලකා බලන්න:
ඊ.එම්.පී.
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
ෙදපාර්තෙම්න්තුෙව්
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
බොහෝ විට ලියා ඇත්තේ SQL විමසුම් වල JOIN ලෙස ය. එය ආපසු ලබා දෙන්නේ වගු අතර ගැලපෙන වාර්තා පමණි.
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
ඔබ ඉහත දුටු පරිදි, නිමැවුමේ EMPJose
වෙතින් මුද්රණය නොකෙරේ , මන්ද එය දෙපාර්තමේන්තු වගුවේ dept_id නොගැලපේ. ඒ හා සමානව, සහ පේළි මුද්රණය නොමැත දෙපාර්තමේන්තුව6
HR
R&D
එම්ප් වගුවේ ගැලපීමක් සොයාගත නොහැකි වූ වගුවෙන් .
ඉතින්, INNER JOIN හෝ JOIN, නැවත ලබා දෙන්නේ ගැලපෙන පේළි පමණි.
මෙය සියලු වාර්තා LEFT වගුවෙන් ලබා දෙන අතර RIGHT වගුවෙන් ගැලපෙන වාර්තා පමණි.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
එබැවින්, ඔබ ඉහත ප්රතිදානය නිරීක්ෂණය කරන්නේ නම්, LEFT වගුවේ (Emp) සියලුම වාර්තා RIGHT වගුවෙන් ගැලපෙන වාර්තා සමඟ මුද්රණය කෙරේ.
HR
සහ දෙපාර්තමේන්තු වගුවෙන් R&D
පේළි මුද්රණය නොකෙරේ.
එබැවින්, LEFT JOIN සියළුම පේළි වම් වගුවෙන් ආපසු ලබා දෙන අතර RIGHT වගුවෙන් ගැලපෙන පේළි පමණි.
කරුණාකර පිලිතුරක් විසින් මාටින් ස්මිත් ඇතුළු සහ විශේෂයෙන් අතර වෙනස්කම් වඩා හොඳ illustations සහ විවිධ එක්වෙයි ගැන පැහැදිලි කිරීම් සඳහා FULL OUTER JOIN
, RIGHT OUTER JOIN
සහ LEFT OUTER JOIN
.
මෙම වගු දෙක JOIN
පහත දැක්වෙන s නිරූපණය සඳහා පදනමක් සපයයි :
SELECT *
FROM citizen
CROSS JOIN postalcode
මෙහි ප්රති result ලය වනුයේ සියලුම සංයෝජනයන්හි කාටිසියානු නිෂ්පාදන වේ. කිසිදු JOIN
කොන්දේසියක් අවශ්ය:
INNER JOIN
සරලවම සමාන වේ: JOIN
SELECT *
FROM citizen c
JOIN postalcode p ON c.postal = p.postal
ප්රති result ලය වනුයේ අවශ්ය JOIN
කොන්දේසිය තෘප්තිමත් කරන සංයෝජන ය :
LEFT OUTER JOIN
සමාන වේ LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
citizen
ප්රති match ලය වනුයේ තරඟ නොමැති වුවද සෑම දෙයක්ම වේ postalcode
. නැවතත් JOIN
කොන්දේසියක් අවශ්ය වේ:
සියලුම උදාහරණ ඔරකල් 18 සී මත ධාවනය කර ඇත. ඒවා dbfiddle.uk වෙතින් ලබා ගත හැකි අතර එය වගු වල තිරපිටපත් පැමිණියේ ද ය.
CREATE TABLE citizen (id NUMBER,
name VARCHAR2(20),
postal NUMBER, -- <-- could do with a redesign to postalcode.id instead.
leader NUMBER);
CREATE TABLE postalcode (id NUMBER,
postal NUMBER,
city VARCHAR2(20),
area VARCHAR2(20));
INSERT INTO citizen (id, name, postal, leader)
SELECT 1, 'Smith', 2200, null FROM DUAL
UNION SELECT 2, 'Green', 31006, 1 FROM DUAL
UNION SELECT 3, 'Jensen', 623, 1 FROM DUAL;
INSERT INTO postalcode (id, postal, city, area)
SELECT 1, 2200, 'BigCity', 'Geancy' FROM DUAL
UNION SELECT 2, 31006, 'SmallTown', 'Snizkim' FROM DUAL
UNION SELECT 3, 31006, 'Settlement', 'Moon' FROM DUAL -- <-- Uuh-uhh.
UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space' FROM DUAL;
JOIN
සහWHERE
CROSS JOIN
එහි ප්රති ing ලයක් ලෙස පේළි සාමාන්ය අදහස / INNER JOIN
:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows
අවශ්යතාවයේ ප්රති CROSS JOIN
result ලය ලබා ගැනීම LEFT OUTER JOIN
සඳහා NULL
පේළියක් එකතු කිරීම වැනි උපක්රම අවශ්ය වේ . එය මඟ හැරී ඇත.
INNER JOIN
කාටේෂියානු නිෂ්පාදන බවට පත්වේ. එය සාමාන්ය අදහස / CROSS JOIN
:
SELECT *
FROM citizen c
JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
ඉවත් කරන ලද තත්වයට නොගැලපෙන ප්රති results ල සමඟ හරස් බැඳීම ලෙස අභ්යන්තර බැඳීම සැබවින්ම දැකිය හැකි ස්ථානය මෙයයි. මෙහි ප්රති ing ලයක් ලෙස ඇති පේළි කිසිවක් ඉවත් නොකෙරේ.
ප්රති INNER JOIN
result ලයක් ලබා ගැනීම LEFT OUTER JOIN
සඳහා උපක්රමද අවශ්ය වේ. එය මඟ හැරී ඇත.
LEFT JOIN
සාමාන්ය අදහස ලෙස පේළි වල ප්රති results ල / CROSS JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
LEFT JOIN
සාමාන්ය අදහස ලෙස පේළි වල ප්රති results ල / INNER JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode
"Sql join cross internal outside" හි අනුරූප අන්තර්ජාල සෙවුමකින් Venn රූප සටහන් රාශියක් පෙන්වනු ඇත. මගේ මේසය මත මුද්රිත පිටපතක් තිබී ඇත. නමුත් නිරූපණය පිළිබඳ ගැටළු තිබේ.
කට්ටල න්යාය සඳහා වෙන් රූප සටහන විශිෂ්ටයි, එහිදී මූලද්රව්යයක් එක් හෝ දෙකෙහිම තිබිය හැකිය. නමුත් දත්ත සමුදායන් සඳහා, එක් "කට්ටලයක" මූලද්රව්යයක් වගුවක පේළියක් ලෙස මට පෙනේ, එබැවින් වෙනත් වගු වලද නොමැත. බහුවිධ වගු වල එක් පේළියක් වැනි දෙයක් නොමැත. පේළියක් මේසයට අද්විතීයයි.
ස්වයං සම්බන්ධ වීම යනු එක් එක් මූලද්රව්යය සැබවින්ම කට්ටල දෙකෙහිම එක හා සමාන වන මුල්ලකි. නමුත් එය තවමත් පහත කිසිදු ගැටලුවකින් නිදහස් නොවේ.
මෙම කට්ටලය A
වම්පස ඇති කට්ටලය ( citizen
වගුව) නිරූපණය කරන අතර කට්ටලය පහත සාකච්ඡාවේ B
දකුණු පස ඇති කට්ටලය වේ postalcode
.
කට්ටල දෙකම සෑම අංගයක් අර්ථය අපට අවශ්ය, අනෙක් කට්ටලයක් සෑම අංගයක් සමග ගැලපෙන A
සෑම ප්රමාණය B
මූලද්රව්ය හා B
සෑම ප්රමාණය A
මෙම ලක්ෂයේ කාටිසීය නිෂ්පාදන නිසි නියෝජනය කිරීමට අංග. කට්ටලයක සමාන මූලද්රව්යයන් සඳහා සෙට් න්යාය සාදනු නොලැබේ, එබැවින් එය ප්රායෝගිකව / කළ නොහැකි දෙයක් ලෙස නිරූපණය කිරීමට වෙන් රූප සටහන් සොයා ගතිමි. එය එසේ නොවේUNION
ගැලපෙන .
පේළි එකිනෙකට වෙනස් ය. මෙම UNION
මුළු පේලි 7 වේ. නමුත් ඒවා පොදු ප්රති SQL
results ල කට්ටලයක් සඳහා නොගැලපේ . මෙය කිසිසේත්ම ක්රියාත්මක වන ආකාරය නොවේ CROSS JOIN
:
එය මේ ආකාරයෙන් නියෝජනය කිරීමට උත්සාහ කිරීම:
..but දැන් එය හුදෙක් වගේ INTERSECTION
, එය නිසැකව ම ය කරන නොවේ . තව දුරටත් INTERSECTION
විශේෂිත කට්ටල දෙකෙන් එකක මූලද්රව්යයක් නොමැත . කෙසේ වෙතත්, මෙය මෙයට සමාන සෙවිය හැකි ප්රති results ල මෙන් පෙනේ:
යොමු කිරීම සඳහා CROSS JOIN
s සඳහා සෙවිය හැකි එක් ප්රති result ලයක් Tutorialgateway හි දැකිය හැකිය . මේ වගේම INTERSECTION
හිස්.
මූලද්රව්යයක වටිනාකම රඳා පවතින්නේ JOIN
තත්වය . සෑම පේළියක්ම එම තත්වයට අනන්ය වන කොන්දේසිය යටතේ මෙය නියෝජනය කළ හැකිය. අර්ථය id=x
සත්ය වන්නේ එක් පේළියකට පමණි. වගුවේ පේළි වරක් A
( citizen
වගුවේ බහු පේළි තරග) B
( postalcode
යටතේ) JOIN
තත්ත්වය, ප්රතිඵලය ලෙස එම ගැටලු ඇති CROSS JOIN
: මෙම පේළිය වාර කිහිපයක් නියෝජනය කළ යුතු අතර, සහ න්යාය ඇත්තටම ඒ සඳහා ප්රතිපාදන නැත. අද්විතීයභාවය යටතේ, රූපසටහන කෙසේ වෙතත් ක්රියා කළ හැකි නමුත්, JOIN
රූප සටහනේ මූලද්රව්යයක් ස්ථානගත කිරීම තීරණය කරන්නේ තත්වය බව මතක තබා ගන්න . JOIN
ගමන සඳහා පමණක් පේළියේ ඉතිරි කොටස සමඟ තත්වයේ අගයන් දෙස බැලීම :
කොන්දේසියක් INNER JOIN
සහිත a භාවිතා කරන විට මෙම නිරූපණය සම්පූර්ණයෙන්ම බිඳ වැටේ .ON 1 = 1
CROSS JOIN
ස්වයං- JOIN
, පේළි ඇත්ත වශයෙන්ම වගු දෙකේම අනන්යතා මූලද්රව්යයන් වන නමුත් වගු දෙකම ලෙස නිරූපණය කරන A
අතර B
එය එතරම් සුදුසු නොවේ. උදාහරණයක් ලෙස පොදු ස්වයං-JOIN
තුල පවතී කරවන තත්ත්වය A
ගැලපෙන කිරීමට විවිධ බී අංගයක් ON A.parent = B.child
සිට තරගය කරමින්, A
කිරීමට B
වෙන්වූ කොටස් මත. මේ හා සමාන උදාහරණ වලින් SQL
:
SELECT *
FROM citizen c1
JOIN citizen c2 ON c1.id = c2.leader
තේරුම ස්මිත් යනු ග්රීන් සහ ජෙන්සන් යන දෙදෙනාගේම නායකයාය.
එක් පේළියක අනෙක් වගුවේ පේළි වලට බහුවිධ ගැලපීම් ඇති විට නැවතත් කරදර ආරම්භ වේ. මෙය තවදුරටත් සංකීර්ණ වන්නේ මන්දOUTER JOIN
හිස් කට්ටලයට ගැලපෙන පරිදි විය හැකි . එහෙත්, න්යාය අනුව ඕනෑම කට්ටලයක C
සහ හිස් කට්ටලයක එකමුතුව සැමවිටම යුක්ති සහගත ය C
. හිස් කට්ටලය කිසිවක් එකතු නොකරයි. මෙහි නිරූපණය LEFT OUTER JOIN
සාමාන්යයෙන් ගැලපීමක් තිබේද නැද්ද යන්න නොසලකා A
පේළි A
තෝරාගෙන ඇති බව පෙන්වීමට සියල්ලම පෙන්වයි B
. කෙසේ වෙතත් “ගැලපෙන මූලද්රව්යයන්ට” ඉහත නිදර්ශනයට සමාන ගැටළු ඇත. ඔවුන් තත්වය මත රඳා පවතී. හිස් කට්ටලය පහතට ඇවිද ඇති බව පෙනේ A
:
CROSS JOIN
ස්මිත් හා තැපැල් කේතය සඳ මත ඇති සියලුම පේළි සොයා ගැනීම :
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
දැන් වෙන් රූප සටහන පරාවර්තනය කිරීමට භාවිතා නොවේ JOIN
. එය භාවිතා කරන්නේ වගන්තිය සඳහා පමණිWHERE
:
..ඒක තේරුමක් තියෙනවා.
පැහැදිලි කළ පරිදි INNER JOIN
ඇත්ත වශයෙන්ම එය නොවේ INTERSECT
. කෙසේ වෙතත් INTERSECT
වෙනම විමසුම්වල ප්රති results ල මත s භාවිතා කළ හැකිය. මෙහි වෙනන් රූප සටහනක් අර්ථවත් කරයි, මන්ද වෙනම විමසුම් වල මූලද්රව්ය ඇත්ත වශයෙන්ම පේළි වන අතර ඒවා එක් ප්රති results ලයකට හෝ දෙකටම අයත් වේ. ඡේදනය විමසීම් දෙකෙහිම පේළිය ඇති තැන පමණක් ප්රති results ල ලබා දෙනු ඇත. මෙහි SQL
ප්රති result WHERE
ලය වනුයේ ඉහත පේළියට සමාන පේළියක් වන අතර වෙන් රූප සටහන ද සමාන වේ:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
INTERSECT
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
ක OUTER JOIN
නො වේ UNION
. කෙසේ වෙතත් UNION
එකම කොන්දේසි යටතේ වැඩ කරන්න INTERSECT
, එහි ප්රති all ලයක් ලෙස සියලු ප්රති results ල දෙකම ඒකාබද්ධ වේSELECT
s :
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
UNION
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
එය සමාන වේ:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
OR p.area = 'Moon';
.. සහ ප්රති result ලය ලබා දෙයි:
මෙහි දී වෙන් රූප සටහනක් අර්ථවත් කරයි:
ක වැදගත් සටහනක් , තේරීම් ගේ දෙකක් ප්රතිඵල වල ව්යුහය සංසන්දනය හෝ වෘත්තීය සමිති හැකි වන පරිදි එම විට මෙම පමණක් වැඩ බව ය. මේ දෙකේ ප්රති results ල මඟින් එය සක්රීය නොවේ:
SELECT *
FROM citizen
WHERE name = 'Smith'
SELECT *
FROM postalcode
WHERE area = 'Moon';
.. ප්රති results ල සමඟ ඒකාබද්ධ කිරීමට උත්සාහ කිරීම UNION
a
ORA-01790: expression must have same datatype as corresponding expression
වැඩිදුර උනන්දුව සඳහා JOINs සහ SQL විස්තර කරන විට වෙන් රූපසටහනට කියන්න එපා කියවන්න . දෙකම ආවරණය කරයි EXCEPT
.
ඉතා නිවැරදි සම්බන්ධතා වීජ ගණිත උදාහරණ සමඟ මෙහි හොඳ පිළිතුරු රාශියක් ඇත . SQL කේතකරණ උභතෝකෝටිකයන් සහිත ආධුනික හෝ නවක කෝඩර සඳහා ප්රයෝජනවත් විය හැකි ඉතා සරල පිළිතුරක් මෙන්න.
මූලික වශයෙන්, බොහෝ විට, විමසුම් JOIN
අවස්ථා දෙකක් දක්වා අඩු වේ:
සඳහා SELECT
දත්ත වල උප කුලකයක් A
:
INNER JOIN
අදාළ දත්ත භාවිතා කළ යුතුයB
දත්ත සමුදාය නිර්මාණය අනුව පවතින බවත්;LEFT JOIN
අදාළ දත්ත භාවිතා කරන විට භාවිතා කරන්න .B
අතර වෙනස inner join
සහ outer join
පහත සඳහන් පරිදි වේ:
Inner join
ගැලපෙන ටුපල් මත පදනම් වූ ඒකාබද්ධ වගු outer join
වන අතර, ගැලපෙන හා අසමසම ටුපල් මත පදනම් වූ ඒකාබද්ධ වගුවකි.Inner join
අසමසම පේළිය අතහැර දමා ඇති වගු දෙකකින් ගැලපෙන පේළිය outer join
ඒකාබද්ධ කරන අතර, වගු දෙකකින් පේළි ඒකාබද්ධ කරන අතර අසමසම පේළි ශුන්ය අගයකින් පුරවනු ලැබේ.Inner join
එය ඡේදනය වීමේ මෙහෙයුමක් හා outer join
සමාන ය.Inner join
වර්ග දෙකක් වන අතර outer join
වර්ග තුනක් වේ.outer join
වඩා වේගවත් inner join
.