একটি ক্রস জয় দুটি সেট এর টিপলগুলিতে একটি কার্টেসিয়ান পণ্য সম্পাদন করে।
SELECT *
FROM Table1
CROSS JOIN Table2
কোন পরিস্থিতিতে এই জাতীয় এসকিউএল অপারেশন বিশেষভাবে কার্যকর হয়?
একটি ক্রস জয় দুটি সেট এর টিপলগুলিতে একটি কার্টেসিয়ান পণ্য সম্পাদন করে।
SELECT *
FROM Table1
CROSS JOIN Table2
কোন পরিস্থিতিতে এই জাতীয় এসকিউএল অপারেশন বিশেষভাবে কার্যকর হয়?
উত্তর:
আপনার যদি এমন কোনও "গ্রিড" থাকে যা আপনি পোশাকের নির্দিষ্ট নিবন্ধের জন্য আকার এবং রঙের তথ্যের মতো সম্পূর্ণরূপে পপুলেশন করতে চান:
select
size,
color
from
sizes CROSS JOIN colors
সম্ভবত আপনি এমন একটি টেবিল চান যাটিতে প্রতিদিন প্রতি মিনিটের জন্য একটি সারি থাকে এবং আপনি প্রতি মিনিটে কোনও প্রক্রিয়া কার্যকর করেছে তা যাচাই করতে আপনি এটি ব্যবহার করতে চান, তাই আপনি তিনটি টেবিল অতিক্রম করতে পারেন:
select
hour,
minute
from
hours CROSS JOIN minutes
অথবা আপনার কাছে স্ট্যান্ডার্ড রিপোর্ট চশমাগুলির একটি সেট রয়েছে যা আপনি বছরে প্রতি মাসে প্রয়োগ করতে চান:
select
specId,
month
from
reports CROSS JOIN months
এগুলি দর্শন হিসাবে বজায় রাখার সমস্যাটি হ'ল বেশিরভাগ ক্ষেত্রে, আপনি একটি সম্পূর্ণ পণ্য চান না, বিশেষত পোশাকের ক্ষেত্রে। আপনি MINUS
বহন করেন না এমন নির্দিষ্ট সংমিশ্রণগুলি সরাতে আপনি ক্যোয়ারিতে যুক্তি যুক্ত করতে পারেন তবে কোনও টেবিলকে অন্য কোনও উপায়ে পপুলেশন করা এবং কার্তেসিয়ান পণ্যটি ব্যবহার না করা আপনার পক্ষে আরও সহজ হতে পারে।
এছাড়াও, আপনি টেবিলগুলিতে ক্রস যোগ দেওয়ার চেষ্টা করতে পারেন যা সম্ভবত আপনি ভাবেন তার চেয়ে আরও কয়েকটি সারি রয়েছে বা সম্ভবত আপনার WHERE
ধারাটি আংশিক বা সম্পূর্ণ অনুপস্থিত ছিল। সেক্ষেত্রে আপনার ডিবিএ আপনাকে অবিলম্বে বাদ দেওয়ার বিষয়ে অবহিত করবে। সাধারণত সে সুখী হয় না।
পরীক্ষার জন্য ডেটা তৈরি করুন।
আপনি সাধারণত বেশিরভাগ ডাটাবেস প্রশ্নের জন্য একটি সম্পূর্ণ কার্টেসিয়ান পণ্য চান না। রিলেশনাল ডাটাবেসের পুরো শক্তিটি হ'ল আপনি ডিবি থেকে অপ্রয়োজনীয় সারিগুলি এড়ানো এড়াতে আপনার আগ্রহী হতে পারে এমন যে কোনও বিধিনিষেধ প্রয়োগ করতে পারেন।
আমি মনে করি এমন একটি সঙ্কলিত উদাহরণ যেখানে আপনি এটি চান তা হতে পারে যদি আপনার কাছে কর্মীদের একটি টেবিল থাকে এবং এমন একটি টেবিল থাকে যা করার প্রয়োজন হয় এবং একটি চাকরিতে একজন কর্মীর সমস্ত সম্ভাব্য অ্যাসাইনমেন্ট দেখতে চান।
ঠিক আছে, এটি সম্ভবত প্রশ্নের উত্তর দেবে না, তবে, যদি এটি সত্য হয় (এবং আমি এটি সম্পর্কে নিশ্চিত নই) এটি ইতিহাসের মজাদার একটি বিট।
ওরাকলের প্রথম দিনগুলিতে, একজন বিকাশকারী বুঝতে পেরেছিল যে তাকে একটি সারণীতে প্রতিটি সারিটির নকল করা দরকার (উদাহরণস্বরূপ, এটি ইভেন্টের টেবিল ছিল এবং এটি আলাদাভাবে "সূচনা ইভেন্ট" এবং "শেষ ইভেন্ট" পরিবর্তন করার প্রয়োজন ছিল এন্ট্রি)। তিনি বুঝতে পেরেছিলেন যে যদি তার কেবল দুটি সারি সহ একটি টেবিল থাকে তবে তিনি প্রথম টেবিলের কেবল কলামগুলি নির্বাচন করে একটি ক্রস জয়েন করতে পারেন এবং তার প্রয়োজনীয়তাটি ঠিকঠাক পেতে পারেন। সুতরাং তিনি একটি সাধারণ টেবিল তৈরি করেছিলেন, যা তিনি স্বাভাবিকভাবেই যথেষ্ট পরিমাণে "ডুয়াল" নামে পরিচিত।
পরে, তাকে এমন কিছু করা দরকার যা কেবল কোনও টেবিল থেকে একটি নির্বাচনের মাধ্যমে সম্পন্ন করা যেতে পারে, যদিও অ্যাকশনটির নিজের সাথে টেবিলের সাথে কোনও সম্পর্ক ছিল না, (সম্ভবত তিনি তার ঘড়িটি ভুলে গিয়েছিলেন এবং সময়টি নির্বাচন থেকে সিলেক্টের মাধ্যমে পড়তে চেয়েছিলেন .. ।) সে বুঝতে পেরেছিল যে তার কাছে এখনও তার ডুয়াল টেবিলটি পড়ে আছে এবং এটি ব্যবহার করেছে। কিছুক্ষণ পরে, তিনি দু'বার মুদ্রিত সময়টি দেখে ক্লান্ত হয়ে পড়েছিলেন, ফলে তিনি একটির সারি মুছে ফেলেন।
ওরাকলে থাকা অন্যরা তার টেবিলটি ব্যবহার শুরু করেছিলেন এবং শেষ পর্যন্ত, এটি স্ট্যান্ডার্ড ওরাকল ইনস্টলেশনতে অন্তর্ভুক্ত করার সিদ্ধান্ত নেওয়া হয়েছিল।
যা ব্যাখ্যা করে যে একটি টেবিলের যার একমাত্র তাত্পর্য এটি হ'ল এর একটি সারিতে একটি নাম রয়েছে যার অর্থ "দুটি"।
কীটি হল "আমাকে সমস্ত সম্ভাব্য সংমিশ্রণগুলি দেখান"। আমি এগুলি অন্য গণনা করা ক্ষেত্রগুলির সাথে মিলিয়ে ব্যবহার করেছি তারপরে বাছাই করা / ফিল্টার করা।
উদাহরণস্বরূপ, বলুন আপনি একটি সালিসি (ট্রেডিং) অ্যাপ্লিকেশন তৈরি করছেন। আপনার কাছে বিক্রেতারা দামে পণ্য সরবরাহ করছেন এবং ক্রেতারা কোনও দামে পণ্য চাইছেন। আপনি পণ্যের কীতে ক্রস জয়েন করেন (সম্ভাব্য ক্রেতাদের এবং বিক্রেতাদের সাথে মেলে তুলতে), ব্যয় এবং দামের মধ্যে স্প্রেড গণনা করুন, তারপরে ডেস্ককে সাজান। আপনাকে (মধ্যস্থতাকে) কার্যকর করার জন্য সবচেয়ে লাভজনক বাণিজ্য দেওয়ার জন্য এটির উপর। প্রায়শই আপনার কাছে অবশ্যই অন্যান্য সীমাবদ্ধ ফিল্টার মানদণ্ড থাকে।
অঙ্কের টেবিলের মতো কিছু নেয়, যার মধ্যে 0-9 অঙ্কের দশটি সারি থাকে। ফলাফলটি যথাযথভাবে গণনা করা সহ আপনি যে ফলাফলটি পেতে পারেন তার অনেকগুলি সারণী পেতে আপনি সেই টেবিলটিতে কয়েকবার ক্রস জয়েন ব্যবহার করতে পারেন। এর বেশ কয়েকটি ব্যবহার রয়েছে। উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট বছরে প্রতিদিনের জন্য একটি সেট পেতে এটি একটি ডেটাড () ফাংশনটির সাথে একত্রিত করতে পারেন।
ক্রসস্ট্যাব প্রতিবেদন তৈরি করতে ক্রস জয়েন ব্যবহার করার এটি একটি আকর্ষণীয় উপায় । আমি স্মার্টটিসের জন্য জো সেলকোর এসকিউএল এ পেয়েছি এবং এটি বেশ কয়েকবার ব্যবহার করেছি। এটি একটি সামান্য সেটআপ লাগে না, কিন্তু সময় ব্যয় করা মূল্য ছিল।
কল্পনা করুন যে আপনার কাছে আইটেম এবং তারিখের একটি নির্দিষ্ট সংমিশ্রণ (দাম, প্রাপ্যতা, ইত্যাদি) প্রদান করতে চান এমন একাধিক প্রশ্ন রয়েছে। আপনি আইটেম এবং তারিখগুলি পৃথক টেম্প টেবিলগুলিতে লোড করতে এবং আপনার প্রশ্নগুলি টেবিলগুলিতে সংযুক্ত করতে পারেন। আইএন ক্লজে আইটেম এবং তারিখ গণনার বিকল্পের তুলনায় এটি আরও সুবিধাজনক হতে পারে, বিশেষত যেহেতু কিছু ডাটাবেস একটি আইএন ধারাতে উপাদানগুলির সংখ্যা সীমাবদ্ধ করে।
আপনি এটি ব্যবহার করতে পারেন ক্রস JOIN উদ্দেশ্যে পরীক্ষার জন্য ডেটা উৎপন্ন - - আপনি যেমন রক্ত গোষ্ঠী (এ, বি, ..) এর সব সম্ভব সমন্বয় প্রয়োজন রহঃ - - সব সম্পত্তি মেশা / + ইত্যাদি ...: থেকে এটা --tune আপনার উদ্দেশ্যে;) - আমি এই ক্ষেত্রে বিশেষজ্ঞ নই;)
CREATE TABLE "HR"."BL_GRP_01"
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);
CREATE TABLE "HR"."BL_GRP_02"
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);
CREATE TABLE "HR"."RH_VAL_01"
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);
select distinct a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;