নোট অস্তিত্বের তুলনায় কী পার্থক্য? বনাম নয় বনাম বামে যোগ করুন কোথায় আছে?


151

আমার কাছে মনে হয় যে আপনি এসকিউএল কোয়েরিতে একই জিনিসটি বিদ্যমান নেই, নেই, বা যেখানে নেই সেখানে বামে যোগ দিয়ে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)

SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)

SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL

আমি নিশ্চিত না যে আমার সমস্ত বাক্য গঠন সঠিক হয়েছে কিনা, তবে এগুলি আমি দেখেছি এমন সাধারণ কৌশল। আমি কেন অপরটিকে ব্যবহার করতে পছন্দ করব? পারফর্মেন্স কি আলাদা হয় ...? এর মধ্যে কোনটি দ্রুত / সবচেয়ে দক্ষ? (যদি এটি বাস্তবায়নের উপর নির্ভর করে তবে আমি কখন প্রত্যেকে ব্যবহার করব?)


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

2
@ উইচ: আপনি কীভাবে EXISTSক্লজের অভ্যন্তরে ফিরে আসবেন সে সম্পর্কে কোনও ডাটাবেস পাত্তা দেয় না । আপনি ফেরত দিতে পারেন *, NULLবা যাই হোক না কেন: এই সব দূরে অপ্টিমাইজ করা হবে না।
কাসনসুই

2
@ যা - কেন? উভয় এখানে: techonthenet.com/sql/exists.php এবং এখানে: msdn.microsoft.com/en-us/library/ms188336.aspx ব্যবহার করতে * মনে ...
froadie

8
@ উইচ: এটি "আগ্রহ প্রকাশের" বিষয় নয়। এটি ক্যোয়ার পার্সার সম্পর্কিত যা আপনাকে SELECTএবং এর মধ্যে কিছু রাখার দাবি করে FROM। এবং *টাইপ করা সহজ। হ্যাঁ, SQLকোনও প্রাকৃতিক ভাষার সাথে কিছু সাদৃশ্য রয়েছে তবে এটি একটি যন্ত্র, একটি প্রোগ্রামযুক্ত মেশিন দ্বারা পার্স এবং কার্যকর করা হয়েছে। এটি এমন নয় যে এটি কখনও কখনও হঠাৎ আপনার ঘনক্ষেত্রে প্রবেশ করবে এবং চিৎকার করবে "কোনও EXISTSক্যোয়ারীতে অতিরিক্ত ক্ষেত্রের জন্য দাবি করা বন্ধ করুন কারণ আমি তাদের পার্স করার পরে অসুস্থ হয়ে পড়েছি!" সত্যিই, এটি একটি কম্পিউটারের সাথে ঠিক আছে।
কাসনসুই

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

উত্তর:


139

1
লিঙ্কগুলির জন্য ধন্যবাদ! এবং দ্রুত ওভারভিউয়ের জন্য ধন্যবাদ ... আমার অফিসটি কোনও কারণে লিঙ্কটি ব্লক করছে: পি তবে আমি নিয়মিত কম্পিউটারে পৌঁছামাত্রই এটি পরীক্ষা করে দেখব।
froadie

2
আরেকটি বিষয় হ'ল যদি ক্যোয়ারী table1 .aথাকে NULLতবে EXISTSএই সারিটি ফেরত দেবে না তবে NOT INকোয়েরিটি table2খালি থাকলে will না ইন বনাম। নলযোগ্য কলামগুলি নেই: এসকিউএল সার্ভার
মার্টিন স্মিথ

@ মার্টিনস্মিত: NULL NOT IN ()সত্যের কাছে মূল্যায়ন করে (ঠিক নয় NULL), ঠিক তেমনিNOT EXISTS (NULL = column)
কোআসনোই

2
@ কাসনোই - এর, ভাল পয়েন্ট, ভুল পথটি পেয়েছে। NOT EXISTSসবসময় সারি ফিরে আসবে কিন্তু NOT INযদি সাব প্রশ্নের সাথে কোন সারি ফেরৎ শুধু তাই চেষ্টা করতে হবে।
মার্টিন স্মিথ

5

যদি ডাটাবেসটি ক্যোয়ারীটি অনুকূল করে তুলতে ভাল হয় তবে দুটি প্রথমে তৃতীয়টির কাছাকাছি কিছুতে রূপান্তরিত হবে।

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


2

ধরে নেওয়া যাক আপনি নালগুলি এড়িয়ে যাচ্ছেন, এটি স্ট্যান্ডার্ড এসকিউএল ব্যবহার করে একটি অ্যান্টি-জয়েন লেখার সমস্ত উপায় ।

একটি সুস্পষ্ট বাদ দেওয়া সমান ব্যবহার করে EXCEPT:

SELECT a FROM table1
EXCEPT
SELECT a FROM table2

ওরাকলে নোট করুন আপনাকে MINUSঅপারেটরটি ব্যবহার করতে হবে (যুক্তিযুক্তভাবে আরও ভাল নাম):

SELECT a FROM table1
MINUS
SELECT a FROM table2

মালিকানাধর্মী সিনট্যাক্সের কথা বলতে গেলে, আপনি যেমন OUTER APPLYএসকিউএল সার্ভারে ব্যবহার করছেন এমন পণ্যের উপর নির্ভর করে তদন্তের অ-মানক সমতুল্য হতে পারে ( যেমন কিছু):

SELECT t1.a
  FROM table1 t1
       OUTER APPLY 
       (
        SELECT t2.a
          FROM table2 t2
         WHERE t2.a = t1.a
       ) AS dt1
 WHERE dt1.a IS NULL;

0

যখন বহু-ক্ষেত্রের প্রাথমিক কী সহ টেবিলে ডেটা toোকানোর দরকার হয় তখন বিবেচনা করুন যে এটি আরও দ্রুত হবে (আমি অ্যাক্সেসে চেষ্টা করেছিলাম তবে আমি কোনও ডাটাবেজে মনে করি) "টেবিলে 'যেমন' মানগুলির সাথে রেকর্ডের অস্তিত্ব নেই" তা পরীক্ষা না করে, - বরং কেবল সারণিতে সন্নিবেশ করুন এবং অতিরিক্ত রেকর্ডগুলি (কী দ্বারা) দু'বার sertedোকানো হবে না।


0

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


1
এবং যখন আপনার আসলে প্রয়োজন হয় তখন আপনি কাজের প্রস্তাব হিসাবে কী করবেন NOT?
dnoeth

হ্যাঁ, যখন কারণের কোনও বিকল্প নেই তখন আমাদের না অপারেশন এবং তাদের উপস্থিতি কেন তা ব্যবহার করতে হবে। সর্বোত্তম অনুশীলন হ'ল যখন আমাদের কাছে অন্য কোনও বিকল্প সমাধান থাকে it
লাহিরু কুরে

@ মাওনাদেউহেন, যদি কোনও অপ্টিমাইজার কোনও ক্যোয়ারিকে রূপান্তর করে এবং এটি ভুল ফলাফল দেয় তবে এটি একটি বাগ
ডেভিড דודו মার্কোভিটজ

@ দুদুমার্কোভিটস: হ্যাঁ এবং আপনি যদি এসকিউএল সার্ভার টিমের সাথে যোগাযোগ করেন এবং তারা বাগটি স্বীকার করে তবে এটি সমাধান করতে অস্বীকার করে কারণ তারা বলে যে এটি করার ফলে অনুসন্ধানগুলি ধীরগতিতে চালিত হতে পারে, তবে এটি আপনার সাথে মোকাবিলা করার প্রয়োজন একটি বাগ ।
onedaywhen

@ এমনেদয়েন - এটি অনুমান করা একটি অনুমানের দৃশ্য নয় :-) আপনি কি কোনও সুযোগে বাগের বিবরণ মনে রাখবেন?
ডেভিড דודו মার্কোভিটস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.