উত্তর:
exists
শব্দ যে ভাবে ব্যবহার করা যেতে পারে, কিন্তু সত্যিই এটা এড়ানোর কাউন্টিং করার জন্য একটি উপায় হিসেবে উদ্দীষ্ট এমন:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
এটি সর্বাধিক কার্যকর যেখানে আপনার if
শর্তাধীন বিবৃতি রয়েছে, তার exists
চেয়ে অনেক বেশি দ্রুত হতে পারে count
।
in
সেরা ব্যবহৃত তুমি কোথায় একটি স্ট্যাটিক তালিকা পাস করতে হবে হয়:
select * from [table]
where [field] in (1, 2, 3)
আপনি যখন কোনও in
বিবৃতিতে একটি টেবিল রাখেন তখন এটি ব্যবহার করা আরও বোধগম্য হয় join
তবে বেশিরভাগ ক্ষেত্রে এটি কোনও বিষয় নয়। ক্যোয়ারী অপটিমাইজারের একই পরিকল্পনাটি কোনওভাবেই ফিরিয়ে দেওয়া উচিত। কিছু বাস্তবায়নে (বেশিরভাগ পুরানো, যেমন মাইক্রোসফ্ট এসকিউএল সার্ভার 2000) in
কোয়েরিগুলি সর্বদা নেস্টেড জয়েন প্ল্যান পাবে, যখন join
কোয়েরিগুলি নেস্টেড, মার্জ বা হ্যাশ উপযুক্ত হিসাবে ব্যবহার করবে । আরও আধুনিক বাস্তবায়ন বুদ্ধিমান এবং in
ব্যবহার করার পরেও পরিকল্পনাটি সামঞ্জস্য করতে পারে ।
select * from [table] where [field] in (select [field] from [table2])
হিসাবে একই ফলাফল (এবং ক্যোয়ারী পরিকল্পনা) প্রদান করে select * from [table] join [table2] on [table2].[field] = [table].[field]
।
table
, যখন দ্বিতীয়টি সমস্ত কিছু থেকে table
এবং ফিরে আসে table2
। কিছু (বেশিরভাগ পুরানো) এসকিউএল ডেটাবেজে in
কোয়েরিটি নেস্টেড জয়েন হিসাবে প্রয়োগ করা হবে, যখন join
কোয়েরিটি নীস্ট করা, মার্জ করা, হ্যাশ করা ইত্যাদি হতে পারে - যাই হোক না কেন দ্রুত।
exists
কেস স্টেটমেন্টের মধ্যে ব্যবহার করা যেতে পারে, সুতরাং select case when exists (select 1 from emp where salary > 1000) then 1 else 0 end as sal_over_1000
EXISTS
আপনাকে জিজ্ঞাসা করবে যে কোনও ক্যোয়ারির কোনও ফলাফল ফিরে এসেছে কিনা। উদাহরণ:
SELECT *
FROM Orders o
WHERE EXISTS (
SELECT *
FROM Products p
WHERE p.ProductNumber = o.ProductNumber)
IN
একের মানকে বিভিন্নের সাথে তুলনা করতে ব্যবহৃত হয় এবং আক্ষরিক মানগুলি ব্যবহার করতে পারে:
SELECT *
FROM Orders
WHERE ProductNumber IN (1, 10, 100)
আপনি ক্লোজের সাথে কোয়েরির ফলাফলগুলিও এর IN
মতো ব্যবহার করতে পারেন :
SELECT *
FROM Orders
WHERE ProductNumber IN (
SELECT ProductNumber
FROM Products
WHERE ProductInventoryQuantity > 0)
নিয়ম অপ্টিমাইজারের উপর ভিত্তি করে :
EXISTS
তুলনায় অনেক দ্রুত IN
সাব-কোয়েরির ফলাফলগুলি খুব বড় হলে তার ।IN
EXISTS
উপ-ক্যোয়ারির ফলাফলগুলি খুব কম হলে তার চেয়ে দ্রুততর হয়।ব্যয় অপ্টিমাইজারের উপর ভিত্তি করে :
আমি ধরে নিচ্ছি যে তারা কী করে তা আপনার জানা আছে, এবং এভাবে অন্যভাবে ব্যবহৃত হয়, সুতরাং আমি আপনার প্রশ্নটি বুঝতে যাচ্ছি: এসকিউএলকে অস্তিত্বের পরিবর্তে IN ব্যবহার করার জন্য কখনই নতুন করে লেখা ভাল হবে বা এর বিপরীতে।
এটা কি ন্যায্য ধারণা?
সম্পাদন করা : যে কারণটি আমি জিজ্ঞাসা করছি তা হ'ল আপনি অনেক ক্ষেত্রে IN এর উপর ভিত্তি করে একটি এসকিউএল পুনরায় লিখতে পারেন পরিবর্তে একটি EXISTS ব্যবহার করতে এবং এর বিপরীতে এবং কিছু ডাটাবেস ইঞ্জিনের জন্য ক্যোয়ারী অপ্টিমাইজার দুটি পৃথকভাবে আচরণ করবে।
এই ক্ষেত্রে:
SELECT *
FROM Customers
WHERE EXISTS (
SELECT *
FROM Orders
WHERE Orders.CustomerID = Customers.ID
)
এতে নতুন করে লেখা যেতে পারে:
SELECT *
FROM Customers
WHERE ID IN (
SELECT CustomerID
FROM Orders
)
বা যোগদানের সাথে:
SELECT Customers.*
FROM Customers
INNER JOIN Orders ON Customers.ID = Orders.CustomerID
সুতরাং আমার প্রশ্নটি এখনও দাঁড়িয়ে আছে, মূল পোস্টারটি কী কী সম্পর্কে এবং অস্তিত্ব সম্পর্কে কী ভেবে অবাক হয়, এবং কীভাবে এটি ব্যবহার করবেন, অথবা তিনি পরিবর্তিত একটি এসকিউএল পুনরায় লেখার জন্য উপস্থিত ব্যবহার করতে ব্যবহার করবেন অথবা এর বিপরীতে, একটি ভাল ধারণা হবে?
JOIN
একটি দরকার হবেDISTINCT
EXISTS
IN
subquery ফলাফল খুব বড় যখন তুলনায় অনেক দ্রুত । subquery ফলাফল খুব ছোট যখন
IN
চেয়ে দ্রুত EXISTS
।
CREATE TABLE t1 (id INT, title VARCHAR(20), someIntCol INT)
GO
CREATE TABLE t2 (id INT, t1Id INT, someData VARCHAR(20))
GO
INSERT INTO t1
SELECT 1, 'title 1', 5 UNION ALL
SELECT 2, 'title 2', 5 UNION ALL
SELECT 3, 'title 3', 5 UNION ALL
SELECT 4, 'title 4', 5 UNION ALL
SELECT null, 'title 5', 5 UNION ALL
SELECT null, 'title 6', 5
INSERT INTO t2
SELECT 1, 1, 'data 1' UNION ALL
SELECT 2, 1, 'data 2' UNION ALL
SELECT 3, 2, 'data 3' UNION ALL
SELECT 4, 3, 'data 4' UNION ALL
SELECT 5, 3, 'data 5' UNION ALL
SELECT 6, 3, 'data 6' UNION ALL
SELECT 7, 4, 'data 7' UNION ALL
SELECT 8, null, 'data 8' UNION ALL
SELECT 9, 6, 'data 9' UNION ALL
SELECT 10, 6, 'data 10' UNION ALL
SELECT 11, 8, 'data 11'
প্রশ্ন ঘ
SELECT
FROM t1
WHERE not EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id)
প্রশ্ন 2
SELECT t1.*
FROM t1
WHERE t1.id not in (SELECT t2.t1id FROM t2 )
যদি t1
আপনার আইডিতে নাল মান থাকে তবে কোয়েরি 1 এগুলি খুঁজে পাবে, কিন্তু ক্যোয়ারি 2 ক্যান্ট নাল প্যারামিটারগুলি খুঁজে পাবে।
আমি বলতে চাইছি IN
নলের সাথে কোনও তুলনা করতে পারছি না, সুতরাং এটি শূন্যের জন্য কোনও ফল দেয় EXISTS
না , তবে নলের সাথে সমস্ত কিছু তুলনা করতে পারে।
আপনি যদি IN
অপারেটরটি ব্যবহার করছেন তবে এসকিউএল ইঞ্জিন অভ্যন্তরীণ কোয়েরি থেকে প্রাপ্ত সমস্ত রেকর্ড স্ক্যান করবে। অন্যদিকে আমরা যদি ব্যবহার করি EXISTS
তবে এসকিউএল ইঞ্জিনটি কোনও মিল খুঁজে পাওয়ার সাথে সাথে স্ক্যানিং প্রক্রিয়াটি বন্ধ করে দেবে।
ইন শুধুমাত্র সমতা সম্পর্ক (অথবা বৈষম্য যখন পূর্বে সমর্থন নয় )।
এটি = যেকোন / = কিছু প্রতিশব্দ , যেমন
select *
from t1
where x in (select x from t2)
;
উপস্থিতি বিভিন্ন ধরণের সম্পর্কের সমর্থন করে, যা IN ব্যবহার করে প্রকাশ করা যায় না - যেমন -
select *
from t1
where exists (select null
from t2
where t2.x=t1.x
and t2.y>t1.y
and t2.z like '℅' || t1.z || '℅'
)
;
EXISTS এবং IN এর মধ্যে কথিত পারফরম্যান্স এবং প্রযুক্তিগত পার্থক্য নির্দিষ্ট বিক্রেতার বাস্তবায়ন / সীমাবদ্ধতা / বাগগুলির ফলে হতে পারে, তবে অনেক সময় তারা ডেটাবেসগুলির অভ্যন্তরীণতাগুলি না বোঝার কারণে তৈরি করা মিথ ছাড়া আর কিছুই নয়।
সারণিগুলির সংজ্ঞা, পরিসংখ্যানের যথার্থতা, ডাটাবেস কনফিগারেশন এবং অপ্টিমাইজারের সংস্করণগুলি কার্যকরভাবে কার্যকর করার পরিকল্পনায় এবং তাই কার্য সম্পাদন মেট্রিকগুলিতে সমস্ত প্রভাব ফেলে have
আমি মনে করি,
EXISTS
যখন আপনার প্রশ্নের ফলাফলগুলি অন্য সাবকিউয়ের সাথে মেলে প্রয়োজন। সাবকিউরি ফলাফল যেখানে মেলে সেখানে ক্যোয়ারী # 1 ফলাফল পুনরুদ্ধার করা দরকার। এক ধরনের যোগদান করুন .. উদাহরণস্বরূপ গ্রাহকদের টেবিল নির্বাচন করুন # 1 যারা অর্ডার টেবিল # 2ও রেখেছেন
যদি কোনও নির্দিষ্ট কলামের মান IN
একটি তালিকা (1,2,3,4,5) থাকে তবে পুনরুদ্ধার করতে হবে Eg উদাহরণস্বরূপ গ্রাহক যারা নীচের জিপকোডে অর্থাৎ জিপ_কোড মান (....) তালিকায় থাকে তাদের নির্বাচন করুন।
কখন অন্যের উপরে ব্যবহার করবেন ... যখন আপনি মনে করেন এটি যথাযথভাবে পড়েছে (উদ্দেশ্যটি আরও ভালভাবে যোগাযোগ করে)।
পার্থক্য এখানে নিহিত:
select *
from abcTable
where exists (select null)
উপরের ক্যোয়ারী সমস্ত রেকর্ড ফিরিয়ে দেবে যখন নীচে একটি খালি ফিরে আসবে।
select *
from abcTable
where abcTable_ID in (select null)
এটি ব্যবহার করে দেখুন এবং আউটপুটটি পর্যবেক্ষণ করুন।
কোনটি দ্রুততর তা অভ্যন্তরীণ ক্যোয়ারী দ্বারা প্রাপ্ত ক্যোয়ারীর সংখ্যার উপর নির্ভর করে:
বিদ্যমান বা সত্যের উপর মূল্যায়ন করুন তবে একাধিক মানের তুলনা করুন। যখন আপনি জানেন না যে রেকর্ডটি বিদ্যমান আছে বা নেই, আপনার উপস্থিতি বেছে নেওয়া উচিত
কারণটি হ'ল এক্সআইএসটিএস অপারেটর "অন্তত পাওয়া" নীতিটির ভিত্তিতে কাজ করে। এটি সত্য প্রত্যাবর্তন করে এবং একবারে কমপক্ষে একটি মিলের সারি পাওয়া গেলে স্ক্যানিং টেবিলটি থামিয়ে দেয়।
অন্যদিকে, আইএন অপারেটরটি যখন সাবকিউয়ের সাথে একত্রিত হয়, তখন মাইএসকিউএলকে অবশ্যই সাবউয়েরিটি প্রথমে প্রক্রিয়া করা উচিত এবং তারপরে পুরো ক্যোয়ারী প্রক্রিয়া করতে সাব-কোয়ের ফলাফলটি ব্যবহার করে।
থাম্বের সাধারণ নিয়মটি হ'ল যদি সাবকিউরিতে একটি বিশাল পরিমাণের ডেটা থাকে তবে এক্সআইএসটিএস অপারেটর আরও ভাল পারফরম্যান্স সরবরাহ করে।
যাইহোক, আইএন অপারেটর ব্যবহার করে এমন ক্যোয়ারী দ্রুত উপস্থাপন করবে যদি সাবকোয়ারি থেকে ফলাফল সেটটি খুব ছোট হয়।
আমার বোধগম্যতা উভয়ই সমান হওয়া উচিত যতক্ষণ না আমরা NULL মানগুলি নিয়ে কাজ করি না।
কেন ক্যোয়ারী = NULL বনামের মানটি ফেরত দেয় না কেন একই কারণটি হল NULL। http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
বুলিয়ান বনাম তুলনামূলক যুক্তি হিসাবে, একটি বুলিয়ান উত্পন্ন করতে উভয় মানের তুলনা করা দরকার এবং শর্তটি যদি কাজ করে তবে তা কোনওরকম হয় o সুতরাং আমি কীভাবে IN ও বিদ্যমান থাকা অন্যরকম আচরণ করে তা বুঝতে ব্যর্থ।
In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403
যদি একটি subquery একাধিক মান ফেরত, আপনি বহির্মুখী ক্যোয়ারী চালানো প্রয়োজন হতে পারে- শর্তে নির্দিষ্ট কলামের মধ্যে মান subquery ফলাফল ফলাফলের কোনও মান মেলে যদি। এই কাজটি সম্পাদন করতে আপনার in
কীওয়ার্ডটি ব্যবহার করতে হবে ।
রেকর্ডগুলির একটি সেট বিদ্যমান কিনা তা পরীক্ষা করতে আপনি একটি সাবকিউরি ব্যবহার করতে পারেন। এই জন্য, আপনি exists
একটি subquery সঙ্গে ধারা ব্যবহার করা প্রয়োজন । exists
শব্দ সবসময় সত্য বা মিথ্যা মান ফিরে।
আমি বিশ্বাস করি এর একটি সরল উত্তর আছে। আপনি তাদের সিস্টেমে এই ফাংশনটি বিকাশকারী লোকদের কাছ থেকে কেন তা পরীক্ষা করেন না?
আপনি যদি এমএস এসকিউএল বিকাশকারী হন তবে সরাসরি মাইক্রোসফ্টের উত্তর এখানে।
IN
:
একটি নির্দিষ্ট মান সাবকোয়ারি বা তালিকার কোনও মানের সাথে মেলে কিনা তা নির্ধারণ করে।
সারিগুলির অস্তিত্বের জন্য পরীক্ষা করার জন্য একটি সাবকোয়ারি নির্দিষ্ট করে।
আমি দেখতে পেলাম যে উপস্থিত কীওয়ার্ড ব্যবহার করা প্রায়শই সত্যিই ধীর হয় (এটি মাইক্রোসফ্ট অ্যাক্সেসে খুব সত্য)। পরিবর্তে আমি এই পদ্ধতিতে জোড় অপারেটরটি ব্যবহার করি: এসকিএল-তে-কী-ওয়ার্ড-কি-ওয়ার্ডটি থাকা উচিত
উপস্থিতিগুলি IN এর চেয়ে আরও দ্রুত পারফরম্যান্সে রয়েছে। যদি ফিল্টারের বেশিরভাগ মানদণ্ড সাবকিউরিতে থাকে তবে IN ব্যবহার করা ভাল এবং যদি ফিল্টারের বেশিরভাগ মানদণ্ড মূল প্রশ্নের মধ্যে থাকে তবে উপস্থিতি ব্যবহার করা আরও ভাল।
আপনি যদি IN অপারেটরটি ব্যবহার করে থাকেন তবে এসকিউএল ইঞ্জিন অভ্যন্তরীণ কোয়েরি থেকে প্রাপ্ত সমস্ত রেকর্ড স্ক্যান করবে। অন্যদিকে আমরা যদি উপস্থিত থাকা ব্যবহার করি তবে এসকিউএল ইঞ্জিনটি কোনও মিল খুঁজে পাওয়ার সাথে সাথে স্ক্যানিং প্রক্রিয়াটি বন্ধ করে দেবে।
IN
এবং EXISTS
সমতুল্য এবং একে অপরের রূপান্তরিত হতে পারে।
JOIN
প্রতিস্থাপন হিসাবে ব্যবহার করতে পারেনIN
।