28 / 100

CROSS JOIN

Jadvallarni kesishma birlashtirish

Kirish: ushbu darsda siz ikkita jadvaldagi qatorlarni Dekart ko'paytmasi bo'yicha birlashtirish uchun PostgreSQL CROSS JOIN bandidan qanday foydalanishni o'rganasiz.


PostgreSQL Cross Join bandini o'rganish

CROSS JOIN birinchi jadvaldagi har bir qatorni ikkinchi jadvaldagi har bir qator bilan birlashtiradi va barcha qatorlarning mumkin bo'lgan kombinatsiyalarini (Dekart ko'paytmasini) qaytaradi.

INNER JOIN, LEFT JOIN va FULL JOIN kabi boshqa birlashtirish turlaridan farqli o'laroq, cross join ikkita jadval qatorlarini moslashtirish uchun hech qanday shartga ega emas.

Mana CROSS JOIN bandining sintaksisi:

query.sql
SELECT
  table1.column1,
  table2.column2,
  ...
FROM
  table1
  CROSS JOIN table2;

Ushbu sintaksisda:

  • Birinchi, FROM bandida birinchi jadval nomini (table1) ko'rsating.
  • Ikkinchi, CROSS JOIN bandida ikkinchi jadval nomini (table2) bering.
  • Uchinchi, SELECT bandida ma'lumot olmoqchi bo'lgan ustunlarni sanab o'ting.

Agar table1 da $n$ ta qator va table2 da $m$ ta qator bo'lsa, CROSS JOIN natijasida $n \times m$ ta qator qaytariladi.

Shuningdek, FROM bandida ikkita jadvalni vergul bilan sanab o'tish orqali ham cross-join hosil qilishingiz mumkin (bu sintaksis qisqaroq, lekin kamroq yaqqol ko'rinadi):

query.sql
SELECT
  table1.column1,
  table2.column2,
  ...
FROM
  table1, table2;

Amaliyotda siz ikkala jadvaldagi qatorlarning barcha mumkin bo'lgan kombinatsiyalarini hosil qilmoqchi bo'lganingizda cross-join dan foydalanasiz.


Cross join qanday ishlashini tushunish

Aytaylik, siz X va Y jadvallarini cross join yordamida birlashtirmoqchisiz:

  • X jadvalida ikkita ustun mavjud: id (kalit) va x.
  • Y jadvalida ham ikkita ustun mavjud: id (kalit) va y.
X jadvaliY jadvali
x-table-cross-joiny-table-cross-join

Cross-join chap jadvaldagi qatorlarning o'ng jadvaldagi barcha qatorlar bilan mumkin bo'lgan barcha kombinatsiyalarini o'z ichiga olgan natijalar to'plamini qaytaradi:

PostgreSQL cross join visualization

Quyidagi diagramma cross join qanday ishlashini tasvirlashning yana bir usulidir:

PostgreSQL cross join diagram


Namunaviy jadvallarni sozlash

Birinchi, products nomli yangi jadval yarating:

query.sql
CREATE TABLE products (
  product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  price DECIMAL(10, 2) NOT NULL
);

Ikkinchi, products jadvaliga uchta qator kiriting:

query.sql
INSERT INTO
  products (name, price)
VALUES
  ('iPhone 14 Pro', 999.99),
  ('iPhone 15 Pro', 1199.99),
  ('Galaxy S23 Ultra', 1149.47) 
RETURNING *;

Natija:

query.sql
 product_id |       name       |  price  
------------+------------------+---------
          1 | iPhone 14 Pro    |  999.99
          2 | iPhone 15 Pro    | 1199.99
          3 | Galaxy S23 Ultra | 1149.47

Uchinchi, warehouses nomli yangi jadval yarating:

query.sql
CREATE TABLE warehouses (
  warehouse_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(100) NOT NULL
);

Nihoyat, warehouses jadvaliga ikkita qator kiriting:

query.sql
INSERT INTO
  warehouses(name)
VALUES
  ('San Jose'),
  ('San Francisco')
RETURNING *;

Natija:

query.sql
 warehouse_id |     name      
--------------+---------------
            1 | San Jose
            2 | San Francisco

PostgreSQL CROSS JOIN amaliy misoli

Aytaylik, siz har bir omborga borib, jismoniy inventarizatsiya tekshiruvini o'tkazishingiz kerak. Ushbu jarayonda siz ombor nomi, mahsulot va uning sonini qayd etishingiz zarur. Inventarizatsiyadan oldin cross-join yordamida barcha omborlar va mahsulotlarning mumkin bo'lgan barcha kombinatsiyalari ro'yxatini shakllantirishingiz mumkin:

query.sql
SELECT
  w.name AS warehouse_name,
  p.name AS product_name,
  '' AS quantity 
FROM
  products p
  CROSS JOIN warehouses w;

Natija:

query.sql
 warehouse_name |   product_name   | quantity 
----------------+------------------+----------
 San Jose       | iPhone 14 Pro    | 
 San Jose       | iPhone 15 Pro    | 
 San Jose       | Galaxy S23 Ultra | 
 San Francisco  | iPhone 14 Pro    | 
 San Francisco  | iPhone 15 Pro    | 
 San Francisco  | Galaxy S23 Ultra | 

Uchinchi ustun bo'lgan quantity har bir ombordagi mahsulot miqdorini yozish uchun bo'sh qoldirilgan.

Quyidagi so'rov products va warehouses jadvallaridagi qatorlarni birlashtirish uchun cross-join ning muqobil vergulli sintaksisidan foydalanadi:

query.sql
SELECT
  w.name AS warehouse_name,
  p.name AS product_name,
  '' AS quantity 
FROM
  products p, warehouses w;

U yuqoridagi so'rov bilan aynan bir xil natijani qaytaradi.


Xulosa

  • Ikkita jadvaldagi qatorlarning barcha kombinatsiyalarini (Dekart ko'paytmasini) hosil qilish uchun CROSS JOIN dan foydalaning.
  • CROSS JOIN da hech qanday ON sharti talab qilinmaydi.
QBilimingizni sinab ko'ring
1 / 5

1. CROSS JOIN qanday natija qaytaradi?