লেনদেন-এসকিউএল মধ্যে প্রতিসম পার্থক্য অপারেশন?


10

আমি সবসময় UNIONএসকিউএল-তে অপারেটর সম্পর্কে জানতাম , তবে কেবল সম্প্রতি আবিষ্কার করেছি যে অন্যান্য সেট অপারেটর ছিল, INTERSECTএবং EXCEPT। আমি এমন কোনও অপারেটর সন্ধান করতে পারিনি যা চতুর্থ বড় সেট অপারেটর করে, প্রতিসাম্যগত পার্থক্য (যেমন এর বিপরীতে INTERSECT))

দেখে মনে হচ্ছে আমি এরকম কিছু ব্যবহার করে পছন্দসই আউটপুট পেতে পারি

SELECT Field FROM A UNION SELECT Field FROM B 
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B

(ধরে নিলাম যে আমি অগ্রাধিকারটি সঠিকভাবে পেয়েছি), বা একটি অ্যান্টি-পূর্ণ-যোগদানের মাধ্যমে:

SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL

তবে এগুলি উভয়ই বরং নিবিড় প্রশ্নের মতো দেখতে বিশেষত অন্য তিনটি বেসিক সেট অপারেশনের তুলনায়। এসকিউএলে কোনও প্রতিসাম্য পার্থক্য অপারেশন রয়েছে এবং আমি কেবল এটি ডকুমেন্টেশনে খুঁজে পাচ্ছি না? অথবা এটি টি-এসকিউএল বাস্তবায়নের কোনও "ক্যানোনিকাল" উপায় আছে?


2
(a EXCEPT b) UNION ALL (b EXCEPT a);আরও দক্ষ হতে পারে।
ypercubeᵀᴹ

@ টাইপারকিউব যা 3 জন যোগ দেয় বা যোগদানের মতো অপারেশন করে। এটি সম্পূর্ণ যোগদানের চেয়ে বেশি দক্ষ হতে পারে এমন কোনও কারণ আমি ভাবতে পারি না।
usr ডিরেক্টরির

@ ওসর এটি আসলে ২ যোগ-সদৃশ অপারেশন, ৩ নয় Union ইউনিয়ন সবই কম ব্যয়বহুল অপারেশন। আমি সম্মত যে FULL JOINআরও কার্যকর হতে পারে। কোনটি সেরা তা টেস্টিং প্রকাশ করতে পারে। এবং অবশ্যই, যদি প্রতিটি টেবিল থেকে আরও / বিভিন্ন কলামের প্রয়োজন হয়, তবে আমার সমাধানটি সহজেই প্রসারণযোগ্য নয়।
ypercubeᵀᴹ

উত্তর:


3

সমস্ত সেট অপারেটর যোগদান বা যোগদান-মত অপারেটর অনুবাদ করা হয়। আপনি কোয়েরি পরিকল্পনায় সাক্ষী করতে পারেন।

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


তবে এটি বোঝা যায় যে আমি সেট অপারেটরগুলি ব্যবহার করতে পছন্দ করি কারণ তারা "অতিরিক্ত কলাম" তৈরি করে না ... আমি এই জাতীয় জিনিসগুলি করতে পারি SELECT Id FROM A WHERE <stuff> EXCEPT Select Id FROM A WHERE <other stuff>এবং এর একটি একক তালিকা পেতে পারি Id। আমি কীভাবে এটি পূর্ণাঙ্গ যোগদানের সাথে করব তা বুঝতে পারি না ... আমাকে কি কেবল দুটি Idকলামের দুটি সেট থাকার সাথে ডিল করতে হবে এবং সেগুলি আবার একত্রিত করতে হবে?
কুতুলু মাইক

বলতে পারেন ISNULL(a.Col, b.Col) AS Col। এটি একটি উত্পন্ন টেবিল বা সিটিইতে মুড়ে দিন এবং আপনি এটিতে আরও ক্রিয়াকলাপের জন্য "ভাঁজ" ফলাফল সেটটি ব্যবহার করতে পারেন। (BTW, আমি প্রতিসম পার্থক্য অপারেটর এখোনো সম্মত হন।)
usr ডিরেক্টরির

2
অন্যদিকে @MichaelEdenfield প্রায় যখন আপনি কি চান অন্যান্য কলাম যে তুলনা / স্বতন্ত্র ব্যবহার করা হচ্ছে? আপনি এটি একটি যোগদানের সাথে করতে পারেন তবে ছেদ করে / বাদ দিয়ে নয়। সুতরাং আমি কিছু ক্ষেত্রে দেখতে পেলাম যে প্রকরণটি দীর্ঘমেয়াদে আরও জটিল হয়ে ওঠে।
অ্যারন বারট্র্যান্ড

2

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

SELECT  'A' TableName, FileType FROM KFX_Inventory I 
    WHERE Not Exists (Select Top 1 1 from KFX_FileType FT WHERE FT.FileType = I.FileType)
UNION ALL
SELECT  'B', FileType FROM KFX_FILEType FT 
    WHERE Not Exists (Select Top 1 1 from KFX_Inventory I WHERE FT.FileType = I.FileType)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.