এসকিউএল-এ যোগদানের অর্ডারটি কী গুরুত্বপূর্ণ?


189

পারফরম্যান্স উপেক্ষা করে, আমি কি নীচে এ এবং বি কোয়েরি থেকে একই ফলাফল পাব? সি এবং ডি সম্পর্কে কীভাবে?

-- A
select *
from   a left join b
           on <blahblah>
       left join c
           on <blahblan>


-- B
select *
from   a left join c
           on <blahblah>
       left join b
           on <blahblan>  

-- C
select *
from   a join b
           on <blahblah>
       join c
           on <blahblan>


-- D
select *
from   a join c
           on <blahblah>
       join b
           on <blahblan>  

11
কি <blahblah>? আপনি কি A থেকে B এবং A থেকে C তে যোগ দিচ্ছেন, বা আপনি A থেকে B এবং B থেকে C তে যোগ দিচ্ছেন?
beny23

2
হাই বেনি, আমার প্রশ্নের কোডটি একটি বিমূর্ততা। আমি A থেকে B বা A তে C তে যোগ দেওয়ার বিষয়ে উদ্বিগ্ন নই, আমি কেবল জানতে চাই যে এর মতো বাক্য গঠনটি অভিন্ন ফলাফল প্রদান করবে।
মাত্র একটি শিক্ষার্থী

উত্তর:


225

জন্য INNERযোগ দিল, না, অর্ডার না ব্যাপার। আপনি যতক্ষণ নিজের নির্বাচন থেকে এই পরিবর্তনটি পরিবর্তন করবেন ততক্ষণ ক্যোয়ারী একই ফলাফলগুলি SELECT *দেবে SELECT a.*, b.*, c.*


( LEFT, RIGHTবা FULL) OUTERযোগদানের জন্য, হ্যাঁ, অর্ডারটি গুরুত্বপূর্ণ - এবং ( আপডেট করা ) জিনিসগুলি আরও জটিল।

প্রথমত, বহিরাগত যোগদানগুলি পরিবর্তনীয় হয় না, তাই a LEFT JOIN bএকই রকম হয় নাb LEFT JOIN a

বহিরাগত যোগদানগুলিও সাহসী নয়, সুতরাং আপনার উদাহরণগুলিতে যা উভয় (যোগাযোগ এবং সহযোগিতা) বৈশিষ্ট্যগুলিকে জড়িত:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id
  LEFT JOIN c
    ON c.ac_id = a.ac_id

সমান :

a LEFT JOIN c 
    ON c.ac_id = a.ac_id
  LEFT JOIN b
    ON b.ab_id = a.ab_id

কিন্তু:

a LEFT JOIN b 
    ON  b.ab_id = a.ab_id
  LEFT JOIN c
    ON  c.ac_id = a.ac_id
    AND c.bc_id = b.bc_id

এর সমতুল্য নয় :

a LEFT JOIN c 
    ON  c.ac_id = a.ac_id
  LEFT JOIN b
    ON  b.ab_id = a.ab_id
    AND b.bc_id = c.bc_id

আরেকটি (আশাবাদী সরল) সাহসিকতার উদাহরণ। এটি হিসাবে চিন্তা করুন (a LEFT JOIN b) LEFT JOIN c:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id          -- AB condition
 LEFT JOIN c
    ON c.bc_id = b.bc_id          -- BC condition

এই সমতূল্য থেকে a LEFT JOIN (b LEFT JOIN c):

a LEFT JOIN  
    b LEFT JOIN c
        ON c.bc_id = b.bc_id          -- BC condition
    ON b.ab_id = a.ab_id          -- AB condition

কেবলমাত্র আমাদের "চমৎকার" ONশর্ত রয়েছে। উভয় ON b.ab_id = a.ab_idএবং c.bc_id = b.bc_idসমতা চেক এবং NULLতুলনা জড়িত না ।

আপনার এমনকি অন্য অপারেটরগুলির সাথে আরও জটিল বা আরও জটিলগুলির সাথে শর্ত থাকতে পারে: ON a.x <= b.xবা ON a.x = 7বা ON a.x LIKE b.xবা ON (a.x, a.y) = (b.x, b.y)এবং দুটি ক্যোয়ারী সমান হবে।

তবে, এর মধ্যে জড়িতদের IS NULLকোনওর মতো বা নাল সম্পর্কিত কোনও ক্রিয়াকলাপ COALESCE()যেমন উদাহরণস্বরূপ শর্তটি থাকলে b.ab_id IS NULLদুটি প্রশ্নের সমতুল্য হবে না।


3
এটি বলা আরও সঠিক যে বাহ্যিক জোড় ততক্ষণ সম্মোহক হয় যতক্ষণ না ভবিষ্যদ্বাণীকারীরা যতক্ষণ না পূর্বাভাসগুলি জড়িত না হয় ততক্ষণ এটি একসামেন্টিভ না বলার অপেক্ষা রাখে না যে কোনও টেবিলে থাকা সমস্ত কলামই ন্যূনাল হয় এমন এক সারিতে প্রেডিকেট সন্তুষ্ট হতে পারে না or 'নালগুলির সাথে সম্পর্কিত একটি ফাংশন'। একটি সহজেই এমন একটি শিকারী কল্পনা করতে পারে যা পূর্বের বর্ণনাকে সন্তুষ্ট করে তবে পরবর্তীকালে নয়, যেমন a.somecol > 0 OR b.someothercol > 0; সাহসিকতা সেই শর্তে ব্যর্থ হতে পারে।
মার্ক আমেরিকা

তবে হ্যাঁ, আমি মনে করি যে প্রযুক্তিগতভাবে সত্য বলা যায় যে আউটর জয়েন যতক্ষণ না এখানে প্রাক্টিকেট আমার বর্ণিত শর্তগুলির মধ্যে সন্তুষ্ট না হয়: স্ট্যাকওভারফ্লো / সেকশনস / ২০০২21216/… (যার প্রথমটিও সাহচর্যকে ভেঙে দেয় অন্তর্ভুক্ত যোগদানকারীদের জন্য, তবে এটি ভাঙার পক্ষে এমন সস্তা এবং সুস্পষ্ট পদ্ধতি যা সম্ভবত এটি উল্লেখ করার মতো নয়)) এটিও উল্লেখ করা দরকার যে সর্বাধিক সাধারণ জাতের জোইন - একটি বিদেশী চাবিতে যোগ দেওয়া - conditions শর্তগুলির মধ্যে একটিও পূরণ করে না doesn't এবং এইভাবে সুন্দর এবং সাহসী।
মার্ক আমেরিকা

1
@ মার্ক অ্যামেরি আপনাকে ধন্যবাদ, আমার সেই বাক্যটি গঠনের জন্য আমার বেশ কঠিন সময় ছিল (এবং আমি ইতিমধ্যে আপনার উত্তরটি
উজ্জীবিত করেছি

ypercube আমার একটি INNER JOINএবং নিম্নলিখিত রয়েছে LEFT JOIN। এটি কি প্রথমটির মতো কাজ করে যা ক্যোয়ারী Filterবেসের রেকর্ডগুলি রাখবে INNER JOINএবং তারপরে রেকর্ডগুলির LEFT JOINজন্য প্রয়োগ করবে Filtered?
মুহাম্মদ বাবর

আসলে, সব যোগদানের ধরনের হয় যেমন এসকিউএল মান দ্বারা নির্দিষ্ট এবং associativity গাণিতিক সংজ্ঞা অনুযায়ী, মিশুক, কিন্তু তারা না প্রদর্শিত মিশুক কারণ প্রথম বন্ধনী সাজানোর চলন্ত প্রয়োজন ONদফা (অর্থাত "স্পেসিফিকেশন যোগদানের") একটি নতুন অবস্থানে । যদিও এটি কেবল সিনট্যাক্স। আপনি যদি রিলেশনাল বীজগণিত স্বরলিপি ব্যবহার করেন (যেখানে যোগদানের স্পেসিফিকেশনটি জোড় অপারেটরের নীচে স্থাপন করা হয়), তবে মিশ্রতা আরও স্পষ্ট হয়। আপনার যুক্তি কেবল বহিরাগত যোগদানগুলিকে কমিটিকেটিভ নয় এমনটি প্রদর্শন করে যা সঠিক
লুকাশ এডার

4

নিয়মিত যোগদানের জন্য, এটি হয় না। TableA join TableBএকই এক্সিকিউশন প্ল্যান তৈরি করবে TableB join TableA(সুতরাং আপনার সি এবং ডি উদাহরণগুলি একই হবে)

বাম এবং ডান এটি করতে যোগ দেয় জন্য। TableA left Join TableBএর চেয়ে আলাদা TableB left Join TableA, তবে এটির তুলনায় এটি একইTableB right Join TableA


4
এটি কেবল চলাচলকেই সম্বোধন করে, তবে প্রশ্নের উদাহরণগুলি দেখায় যে প্রশ্নকারী সাহসীকরণে আগ্রহী। ypercube এর উত্তর উভয়ই সম্বোধন করে।
মার্ক আমেরিকা

2

আপনি যদি বি তে যোগদানের আগে বি থেকে কোনও মাঠে সি যুক্ত হওয়ার চেষ্টা করেন, যেমন:

SELECT A.x, A.y, A.z FROM A 
   INNER JOIN C
       on B.x = C.x
   INNER JOIN b
       on A.x = B.x

আপনার ক্যোয়ারী ব্যর্থ হবে, সুতরাং এই ক্ষেত্রে আদেশ গুরুত্বপূর্ণ।


হ্যাঁ এটি ঠিক, সঠিক উত্তরটি সংশোধন করা উচিত।
নীড় পেনগাস

-2

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

অপ্টিমাইজার কেবলমাত্র সরল FROM অনুচ্ছেদে টেবিলগুলির যোগদানের ক্রম পছন্দ করে। JOIN কীওয়ার্ড ব্যবহার করে বেশিরভাগ যোগদানগুলি সহজ যোগগুলিতে ফ্ল্যাট করা হয়, তাই অপ্টিমাইজার তাদের যোগদানের ক্রমটি বেছে নেয়।

অপ্টিমাইজার বাহ্যিক যোগদানের জন্য যোগদানের আদেশ পছন্দ করে না; এটি বিবৃতিতে নির্দিষ্ট করা আদেশ ব্যবহার করে।

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

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