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.
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:
SELECT
table1.column1,
table2.column2,
...
FROM
table1
CROSS JOIN table2;
Ushbu sintaksisda:
FROM bandida birinchi jadval nomini (table1) ko'rsating.CROSS JOIN bandida ikkinchi jadval nomini (table2) bering.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):
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.
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 jadvali | Y jadvali |
|---|---|
Cross-join chap jadvaldagi qatorlarning o'ng jadvaldagi barcha qatorlar bilan mumkin bo'lgan barcha kombinatsiyalarini o'z ichiga olgan natijalar to'plamini qaytaradi:
Quyidagi diagramma cross join qanday ishlashini tasvirlashning yana bir usulidir:
Birinchi, products nomli yangi jadval yarating:
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:
INSERT INTO
products (name, price)
VALUES
('iPhone 14 Pro', 999.99),
('iPhone 15 Pro', 1199.99),
('Galaxy S23 Ultra', 1149.47)
RETURNING *;
Natija:
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:
CREATE TABLE warehouses (
warehouse_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
Nihoyat, warehouses jadvaliga ikkita qator kiriting:
INSERT INTO
warehouses(name)
VALUES
('San Jose'),
('San Francisco')
RETURNING *;
Natija:
warehouse_id | name
--------------+---------------
1 | San Jose
2 | San Francisco
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:
SELECT
w.name AS warehouse_name,
p.name AS product_name,
'' AS quantity
FROM
products p
CROSS JOIN warehouses w;
Natija:
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:
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.
CROSS JOIN dan foydalaning.CROSS JOIN da hech qanday ON sharti talab qilinmaydi.