سؤال

تؤدي الصلة المتقاطعة إلى منتج ديكارتي على صفوف المجموعتين.

SELECT *
FROM Table1
CROSS JOIN Table2

ما هي الظروف التي تجعل عملية SQL هذه مفيدة بشكل خاص؟

هل كانت مفيدة؟

المحلول

إذا كان لديك "الشبكة" التي ترغب في ملء تماما، مثل حجم ولون معلومات عن مادة معينة من الملابس:

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 الخاص كان جزئيا أو المفقودة تماما. في هذه الحالة، سوف DBA الخاص يخطر لك على الفور من هذا الإغفال. عادة انه أو انها سوف لن تكون سعيدة.

نصائح أخرى

أنت عادة لا تريد الذهاب الى منتج الديكارتي الكامل لمعظم استعلامات قاعدة البيانات. قوة كاملة من قواعد البيانات العلائقية هي التي يمكن تطبيقها مهما كانت القيود التي قد تكون مهتمة في أن تسمح لك لتجنب سحب الصفوف غير الضرورية من ديسيبل.

وأعتقد أن واحدة سبيل المثال مفتعلة حيث قد ترغب أن إذا كان لديك جدول الموظفين وجدول الوظائف التي تحتاج إلى القيام ونريد أن نرى كل المهام الممكنة من موظف واحد إلى وظيفة واحدة.

وتوليد بيانات للاختبار.

وطيب، وهذا ربما لن يجيب على السؤال، ولكن إذا كان هذا صحيحا (وأنا لست حتى متأكدا من ذلك) انها قليلا من المرح التاريخ.

في الأيام الأولى من أوراكل، أدرك واحد من المطورين انه في حاجة لتكرار كل صف في جدول (على سبيل المثال، فمن الممكن أنه كان جدول الأحداث وانه يحتاج الى تغييره فصل "بدء الحدث" و " حدث نهاية "مقالات). أدرك أنه إذا كان جدول مع صفين فقط، وقال انه يمكن أن تفعل عبر الانضمام، واختيار فقط الأعمدة في الجدول الأول، والحصول على وقال انه يحتاج بالضبط. لذلك فهو إنشاء جدول بسيط، وهو أنه من الطبيعي بما فيه الكفاية يسمى "DUAL".

وفي وقت لاحق، وقال انه بحاجة إلى القيام بشيء ما الذي يمكن أن يتم إلا عن طريق اختيار من الجدول، على الرغم من أن العمل في حد ذاته كان علي القيام به مع الجدول شيء، (وربما نسي ساعته وأراد أن يقرأ مرة عبر SELECT SYSDATE FROM ...) وقال انه يدرك انه لا تزال لديها جدول DUAL له الكذب حولها، والتي تستخدم. بعد فترة من الوقت، وقال انه تعب من رؤية الوقت طبع مرتين، حتى انه في نهاية المطاف حذف أحد الصفوف.

بدأت

وآخرون في أوراكل باستخدام طاولته، وفي نهاية المطاف، تقرر إدراجه في تثبيت Oracle قياسي.

وهو ما يفسر لماذا الجدول الذي أهمية الوحيد هو أن لديها صف واحد لديه الاسم الذي يعني "اثنين".

والمفتاح هو "أرني كل مزيج ممكن". لقد استعملت هذه بالتزامن مع حقول محسوبة أخرى لثم فرز / تصفية هؤلاء.

وعلى سبيل المثال، تقول انك بناء تطبيق التحكيم (تداول). لديك الباعة تقدم منتجات بسعر والمشترين يطلبون منتجات بتكلفة. لم تقاطع الانضمام على مفتاح المنتج (لمتابعة المباراة المشترين المحتملين والبائعين)، وحساب الفارق بين التكلفة والسعر، ثم نوع تنازلي. على هذا لإعطائك (الوسيط) في الصفقات الأكثر ربحية لتنفيذه. دائما تقريبا سيكون لديك معايير التصفية المحيط الأخرى بطبيعة الحال.

وتحيط شيء مثل جدول الأرقام، التي لديها عشرة صفوف لأرقام 0-9. يمكنك استخدام عبر الانضمام إلى هذا الجدول عدة مرات لنتيجة الحصول على التي لديها ولكن العديد من الصفوف التي تحتاج إليها، مع نتائج مرقمة بشكل مناسب. هذه لديها عدد من الاستخدامات. على سبيل المثال، يمكنك الجمع بين ذلك مع وظيفة datadd () للحصول على مجموعة لكل يوم في سنة معينة.

وهذا هو وسيلة مثيرة للاهتمام لاستخدام عبر الانضمام إلى <لأ href = "http://books.google.com/books؟id=qNXaiM_gNbYC&pg=PA378&lpg=PA378&dq=crosstab+by+cross+join&source=web&ots=TM2CFUH4rA&sig = T7D9_bjsPV4c2CkOgcgX2mmFMMc وHL = EN & سا = X & منظمة اوكسفام الدولية = book_result وresnum = 2 & ط = نتيجة # PPA378، M1 "يختلط =" نوفولو noreferrer "> إنشاء تقرير جدولي ل. لقد وجدت أنه في SQL جو كيلكو لسمارتيز ، واستخدمت عدة مرات. الأمر يستغرق الإعداد قليلا، ولكن كان يستحق الوقت استثمرت.

وتخيل كان لديك سلسلة من الاستفسارات التي ترغب في إصدار أكثر من تركيبة معينة من العناصر وتواريخ (الأسعار والتوافر، ألخ ..). هل يمكن تحميل المواد ومواعيد في جداول منفصلة الحرارة ويكون استفساراتكم عبر ربط الجداول. وهذا قد يكون أكثر ملاءمة من البديل من تعداد العناصر والتمور في بنود IN، لا سيما وأن بعض قواعد البيانات تحد من عدد من العناصر في جملة IN.

يمكنك استخدامها تقاطع الانضمام ل:- قم بإنشاء بيانات لأغراض الاختبار - الجمع بين جميع الخصائص - تحتاج إلى مزيج ممكن من مجموعات الدم EG (A ، B ، ..) مع Rh -/+، إلخ ...--قم بضبطه لأغراضك؛) - لست خبيرًا في هذا المجال؛)

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;
  • أنشئ صلة لجدولين بدون معرف مشترك ثم قم بتجميعهما باستخدام max()، وما إلى ذلك.للعثور على أعلى مجموعة ممكنة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top