Хрестовий з'єднання виконує декартовий виріб на кортежах двох комплектів.
SELECT *
FROM Table1
CROSS JOIN Table2
Які обставини роблять таку операцію SQL особливо корисною?
Хрестовий з'єднання виконує декартовий виріб на кортежах двох комплектів.
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 негайно повідомить вас про упущення. Зазвичай він чи вона не будуть щасливі.
Створення даних для тестування.
Зазвичай для більшості запитів до бази даних зазвичай не потрібно повноцінного декартового продукту. Вся потужність реляційних баз даних полягає в тому, що ви можете застосовувати будь-які обмеження, які можуть вас зацікавити, щоб уникнути витягування непотрібних рядків з db.
Я припускаю один надуманий приклад, де ви можете хотіти, що це, якщо у вас є таблиця працівників та таблиця завдань, які потребують виконання, і хочете побачити всі можливі призначення одного працівника на одну роботу.
Гаразд, це, мабуть, не дасть відповіді на питання, але, якщо це правда (і я навіть не впевнений у цьому), це кумедна історія.
У перші дні Oracle один з розробників зрозумів, що йому потрібно дублювати кожен рядок у таблиці (наприклад, можливо, це таблиця подій, і йому потрібно змінити її окремими "стартовою подією" та "кінцевою подією" записи). Він зрозумів, що якби у нього була таблиця з лише двома рядами, він може зробити хрестоподібне з'єднання, вибравши лише стовпці в першій таблиці і отримати саме те, що йому потрібно. Тому він створив просту таблицю, яку він, природно, досить назвав "ДУАЛЬНО".
Пізніше йому потрібно зробити щось, що можна було зробити лише за допомогою вибору з таблиці, навіть якщо сама дія не мала нічого спільного з таблицею (можливо, він забув годинник і хотів прочитати час через ВИБІР СИСТАТУ ВІД. .) Він зрозумів, що у нього все ще лежить свій ДУАЛЬНИЙ стіл, і користувався цим. Через деякий час він втомився бачити час, надрукований двічі, тож він, можливо, видалив один із рядків.
Інші в Oracle почали використовувати його стіл, і врешті-решт було вирішено включити його до стандартної установки Oracle.
Що пояснює, чому таблиця, єдине значення якої полягає в тому, що вона має один рядок, має ім’я, що означає "два".
Ключ - "покажи мені всі можливі комбінації". Я використовував їх спільно з іншими розрахованими полями, а потім їх сортував / фільтрував.
Наприклад, скажіть, що ви будуєте арбітражну (торговельну) програму. У вас є продавці, які пропонують продукцію за ціною, і покупці просять товари за вартістю. Ви робите перехресне з'єднання продуктового ключа (щоб відповідати потенційним покупцям та продавцям), розраховуєте спливи між вартістю та ціною, а потім сортуєте дес. на цьому, щоб дати вам (посереднику) найвигідніші угоди для виконання. Майже завжди у вас будуть інші обмежувальні критерії фільтра.
Бере щось подібне до таблиці цифр, у якій десять рядків для цифр 0-9. Ви можете використовувати перехресне з'єднання на цій таблиці кілька разів, щоб отримати результат, який має скільки завгодно рядків, при цьому результати будуть пронумеровані відповідним чином. Це має ряд застосувань. Наприклад, ви можете комбінувати його з функцією datadd (), щоб отримати набір на кожен день у даному році.
Це цікавий спосіб використання перехресного з'єднання для створення звіту про перехресні вкладки . Я знайшов його в SQL Joar Celko для Smarties і вже декілька разів використовував його. Це потребує невеликих налаштувань, але воно варте витраченого часу.
Уявіть, у вас була серія запитів, які ви хочете задати щодо певної комбінації елементів та дат (ціни, доступність тощо). Ви можете завантажити елементи та дати в окремі тимчасові таблиці, а ваші запити перехресно приєднатись до таблиць. Це може бути зручніше, ніж альтернатива перерахування елементів та дат у пунктах IN, тим більше, що деякі бази даних обмежують кількість елементів у пункті IN.
Ви можете використовувати його CROSS JOIN для: - отримання даних для цілей тестування - об'єднати всі властивості - потрібно всі можливі поєднання наприклад , групи крові (A, B, ..) з Rh - / +, і т.д. ... --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;