এই এসকিউএল বিবৃতিতে ডাবল ইনার জোড় ব্যবহার করার কারণ কী?


10

আমি এই উত্তরাধিকারী এসকিউএল কোয়েরিটি দেখছি। আমি যে বিটটি পাচ্ছি না তা হ'ল এটি একই কলামে দু'বার একই টেবিলে যোগদান করছে। আমি টেবিল 1 এবং টেবিল 1 এর সাথে "টেবিল 1 এলিয়াস" উপন্যাসের সাথে যুক্ত হয়েছি,

SELECT DISTINCT othercolumns,
                Table1Alias.columna
FROM   maintable
       INNER JOIN secondarytable
               ON maintable.id1 = secondarytable.a_id1
       INNER JOIN table1
               ON secondarytable.id2 = table1.id3
       INNER JOIN table1 Table1Alias
               ON secondarytable.id2 = Table1Alias.id3
       INNER JOIN thirdtable
               ON table1.id4 = thirdtable.id5
       INNER JOIN fourthtable
               ON thirdtable.id6 = fourthtable.id7
       INNER JOIN fivetable
               ON thirdtable.id8 = fivetable.id9
       INNER JOIN sixthtable
               ON Table1Alias.columna = sixthtable.id10
       LEFT JOIN seventhtable
              ON thirdtable.id11 = seventhtable.id12
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
       AND secondarytable.type456 = 'cate'
       AND table1.type = '0'
       AND Table1Alias.columna = 'conn'

উত্তর:


27

এটি কোয়েরিটি আবার লিখতে সহায়তা করতে পারে, সুতরাং এটি স্পষ্ট যে 2 টি পৃথকভাবে পৃথক হয় , অর্থাত্ পৃথক সাবসেটগুলিতে (একই টেবিলের সাথে) যোগ দেয়:

FROM   maintable 
       INNER JOIN secondarytable 
               ON maintable.id1 = secondarytable.a_id1 
       INNER JOIN table1 
               ON secondarytable.id2 = table1.id3 
              AND table1.type = '0' 
       INNER JOIN table1 Table1Alias 
               ON secondarytable.id2 = Table1Alias.id3 
              AND Table1Alias.columna = 'conn' 
       INNER JOIN
       ...
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09' 
       AND secondarytable.type456 = 'cate' 

যোগদানের পরে কোথায় প্রয়োগ করা হবে না, অর্থাত্ যদি আমি এই সম্মতিগুলি যুক্ত হওয়ার স্টেটমেন্টের অংশ হত, যেমন একটি আন্ডার দ্বারা সংযুক্ত, তবে সমস্ত অভিজ্ঞতাতে যেখানে সন্নিবেশ সারিগুলি সরিয়ে ফেলার ফলাফলটিতে প্রয়োগ করা হয় তাতে আমি সম্মত হব যোগদান টেবিল, আসল যোগদান প্রভাবিত করে না।
ফ্রাঙ্ক হপকিন্স

3
@ ডার্কউইং যতদূর আমি জানি, আপনি যেখানে শর্ত রেখেছেন তাতে কিছু যায় আসে না, কারণ উত্সাহীকরণের সেরা কাজটি সেরা এক্সেসিউশন পরিকল্পনা নিয়ে আসা come তবে তাদের সাথে যোগ দেওয়া আরও ভাল কারণ এটি তাদের আরও পাঠযোগ্য করে তোলে তবে এটি কেবল একটি মতামত
গণিতের

এমনকি যদি এটির পরে যোগদানের ফলাফলগুলি যোগদান করে তবে শেষ পর্যন্ত আলাদা হয়। এবং হ্যাঁ, যোগদান করা সারিগুলি সাধারণত পারফরম্যান্সের উন্নতি হওয়ায় যোগদানের আগে ফিল্টার করা হয়।
Gherman

1
এটি একটি subquery সঙ্গে যোগদানের সমতুল্য, যেমন INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1। যা এটি ঘটছে তা আরও স্পষ্ট করে তুলতে পারে।
বার্মার

3
@ গণিত - শর্তটি ONযোগদানের WHEREদফায় থাকুক বা দফায় থাকাকালীন যদি যোগ দেওয়া হয় তবে তা একটি বড় ব্যাপার হতে পারে OUTER JOIN। যদি শর্তটিতে কোনও শর্ত ব্যর্থ হয় তবে ONপ্রাথমিক সারিটি এখনও অন্তর্ভুক্ত থাকে (কোনও মিলের বাইরের সারি ছাড়াই); যদি এটি ধারাটিতে ব্যর্থ হয় তবে WHEREপ্রাথমিক সারিতে ফলাফল সেট থেকে বাদ দেওয়া হবে।
আরডিফোজ 21

8

whereঅনুচ্ছেদের দিকে তাকিয়ে , সারিটি দ্বারা চিহ্নিত করা হচ্ছে table1কলামটি type= '0' এ এবং সারিটির দ্বারা নির্দেশ করা হচ্ছে table1aliasকলামটি columna= 'সংযোগ' প্রয়োজন।

সম্ভবত সেখানে একাধিক সারি হয় table1একই জন্য id3?


2

টেবিলের কাঠামোটি না দেখে - পদ্ধতির সাহায্যে একটি ছোট আচ্ছাদন সূচক ব্যবহার করা সম্ভব হবে এবং তারপরে একটি 'কী লুকআপ' অপারেশন এড়ানোর জন্য সারিগুলির অবশিষ্টাংশ পেতে এবং বিদ্যমান সূচীগুলিকে সংশোধন করা এড়ানোর জন্য বৃহত্তর আচ্ছাদন সূচীতে টেবিলের সাথে যোগ দেওয়া যেতে পারে the (বা আপনি যদি সূচিগুলি পরিবর্তন করতে না পারেন)


2

যখনই কোনও জটিলটিতে কোনও টেবিলে একাধিকবার উপস্থিত হয়, এটি সাধারণত কারণ এমন একটি সত্তা রয়েছে যা একাধিক সম্পর্কের সাথে অংশ নেয়। @ ইয়ারকিউব যে উত্তর দিয়েছিল তা বিচার করে এখানে বিষয়টি এখানে উপস্থিত হবে বলে মনে হচ্ছে।

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

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

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