Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Panduan Utama Anda untuk Bergabung dengan SQL:CROSS JOIN – Bagian 3

CROSS JOIN menjadi sorotan. Artikel ini menyelesaikan seri kecil publikasi terkait SQL JOIN kami. Jika Anda melewatkan dua artikel sebelumnya, bacalah sebagai berikut:

  • Panduan Utama Anda tentang SQL Join – Bagian 1:INNER JOIN
  • Panduan Utama Anda untuk SQL Join – Bagian 2:OUTER JOIN

SQL Server CROSS JOIN adalah yang paling sederhana dari semua gabungan. Ini mengimplementasikan kombinasi 2 tabel tanpa kondisi bergabung. Jika Anda memiliki 5 baris di satu tabel dan 3 baris di tabel lain, Anda mendapatkan 15 kombinasi. Definisi lain adalah Produk Cartesian.

Sekarang, mengapa Anda ingin menggabungkan tabel tanpa kondisi bergabung? Tunggu sebentar karena kita sudah sampai di sana. Pertama, mari kita lihat sintaksnya.

Sintaks SQL CROSS JOIN

Seperti halnya INNER JOIN, Anda dapat memiliki CROSS JOIN dari 2 standar, SQL-92 dan SQL-89. T-SQL mendukung kedua sintaks, tetapi saya lebih suka SQL-92. Periksa bagian 1 yang didedikasikan untuk INNER JOIN jika Anda ingin tahu alasannya.

Sintaks SQL-92

SELECT
 a.column1
,b.column2
FROM Table1 a
CROSS JOIN Table2 b

SQL-89

SELECT
 a.column1
,b.column2
FROM Table1 a, Table2 b 

Sama seperti SQL-89 – INNER JOIN tanpa kondisi join.

5 Contoh Menggunakan SQL Server CROSS JOIN

Anda mungkin bertanya-tanya kapan Anda dapat menggunakan SQL CROSS JOIN. Tentu saja, ini berguna untuk membentuk kombinasi nilai. Apa lagi?

1. Data Uji

Jika Anda membutuhkan data dalam jumlah besar, CROSS JOIN akan membantu Anda. Misalnya, Anda memiliki tabel vendor dan produk. Tabel lain berisi produk yang ditawarkan vendor. Jika kosong dan Anda membutuhkan data dengan cepat, inilah yang dapat Anda lakukan:

SELECT
 P.ProductID
,v.BusinessEntityID AS VendorID
FROM 
Production.Product p
CROSS JOIN Purchasing.Vendor v 

Itu menghasilkan 52.416 catatan dalam salinan AdventureWorks saya . Itu cukup untuk menguji aplikasi dan kinerja. Namun, jika Anda mempresentasikan aplikasi Anda kepada pengguna, gunakan sumber Anda alih-alih data ini dari contoh kami.

2. Mendapatkan Hasil dari Kombinasi yang Hilang

Pada artikel sebelumnya, kami mengilustrasikan penggunaan OUTER JOIN untuk mendapatkan hasil dari nilai yang hilang. Kali ini, kita akan menggunakan kombinasi yang hilang. Mari kita coba mendapatkan produk di mana Store 294 tidak menghasilkan uang.

-- get store 294 ('Professional Sales and Service') list of products without sales orders for January 2014
SELECT DISTINCT
 b.Name AS Product
FROM Sales.Store a
CROSS JOIN Production.Product b
LEFT JOIN (SELECT
	     c.StoreID
	    ,a.ProductID
	    ,SUM(a.LineTotal) AS OrderTotal
	    FROM Sales.SalesOrderDetail a
	    INNER JOIN Sales.SalesOrderHeader b ON a.SalesOrderID = b.SalesOrderID
	    INNER JOIN Sales.Customer c ON b.CustomerID = c.CustomerID
	    WHERE c.StoreID = 294 AND
		   b.OrderDate BETWEEN '01/01/2014' AND '01/31/2014'
	    GROUP BY c.StoreID, a.ProductID) d ON a.BusinessEntityID = d.StoreID 
		                                AND b.ProductID = d.ProductID
WHERE d.OrderTotal IS NULL
AND a.BusinessEntityID = 294
ORDER BY b.Name 

Seperti yang Anda lihat, pertama-tama kami membutuhkan semua kombinasi produk dan toko – kami menggunakan CROSS JOIN. Kemudian, kita membutuhkan daftar produk yang dijual untuk periode Januari 2014. Terakhir, terapkan LEFT JOIN ke daftar itu dan gunakan klausa WHERE untuk mendapatkan hanya produk tanpa penjualan. Kemudian, kami mendapatkan informasi tentang produk yang tidak terjual.

3. Membentuk Kata dari Kombinasi Huruf

Jika Anda menyukai permainan kata dengan kombinasi huruf, Anda dapat menggunakan CROSS JOIN dengan self-join. Berikut contoh menggunakan 3 huruf 'D', 'O', dan 'G'.


DECLARE @table TABLE(letter CHAR(1) NOT NULL)

INSERT INTO @table
VALUES ('D'),('O'),('G')

SELECT
 a.letter
,b.letter
,c.letter
FROM @table a
CROSS JOIN @table b
CROSS JOIN @table c
WHERE a.letter + b.letter + c.letter LIKE '%O%'

Kode serupa tanpa klausa WHERE akan menghasilkan 27 record. Klausa WHERE di atas membantu menghilangkan kombinasi 3 kombinasi huruf yang mirip seperti 'DDD' atau 'GGG'. Di bawah ini adalah hasilnya.

Tentu saja, karena saya tidak memasukkan banyak kecerdasan ke dalam kueri, sebagian besar hasilnya bukan kata-kata. Namun, ini membantu dalam bagian berpikir dari permainan.

4. Saran Makanan

Kita semua menyukai makanan, tetapi mungkin sulit untuk memilih kombinasi yang tepat. Seperti pada contoh konsep sebelumnya, berikut adalah cara mendapatkan kemungkinan kombinasi makanan:


DECLARE @FoodMenu TABLE(FoodItem VARCHAR(50) NOT NULL, ItemType CHAR(1) NOT NULL)

-- main course
INSERT INTO @FoodMenu
VALUES
('Spaghetti with Meatballs','M'),
('Spaghetti with Fried Chicken','M'),
('Rice with Roasted Chicken','M')

-- side dish
INSERT INTO @FoodMenu
VALUES
('Buttered Corn and Carrots','S'),
('French Fries','S'),
('Vegetable Coleslaw','S')

-- drinks
INSERT INTO @FoodMenu
VALUES
('Orange Juice','D'),
('Pineapple Juice','D'),
('Soda','D')

SELECT
 a.FoodItem AS MainCourse
,b.FoodItem AS SideDish
,c.FoodItem AS Drinks
FROM @FoodMenu a
CROSS JOIN @FoodMenu b
CROSS JOIN @FoodMenu c
WHERE a.ItemType = 'M' AND
b.ItemType = 'S' AND
c.ItemType = 'D' 

Hasilnya:

Beberapa dari mereka diinginkan. Ada yang seperti, 'lupakan saja!' Itu tergantung selera Anda.

5. Pemilihan Desain Kaos

Kemungkinan penggunaan lain dari CROSS JOIN adalah mendapatkan kombinasi desain untuk kemeja. Berikut contoh kodenya:


DECLARE @tshirts TABLE(attributeType CHAR(1) NOT NULL, Attribute VARCHAR(15))

--size
INSERT INTO @tshirts
VALUES
('S','Small'),
('S','Medium'),
('S','Large')

--color
INSERT INTO @tshirts
VALUES
('C','Red'),
('C','Blue'),
('C','Green'),
('C','Black'),
('C','Purple'),
('C','Yellow'),
('C','White')

--design
INSERT INTO @tshirts
VALUES
('D','Plain'),
('D','Printed')

SELECT
 a.Attribute AS Size
,b.Attribute AS Color
,c.Attribute AS Design
FROM @tshirts a
CROSS JOIN @tshirts b
CROSS JOIN @tshirts c
WHERE a.attributeType = 'S' AND
b.attributeType = 'C' AND 
c.attributeType = 'D'

Dan hasilnya? Perhatikan bagiannya pada Gambar 3:

Bisakah Anda memikirkan beberapa contoh lagi?

Kinerja SQL Server CROSS JOIN

Apa untungnya menggunakan CROSS JOIN? Untuk apa nilainya, CROSS JOIN dapat menyebabkan masalah kinerja jika Anda tidak berhati-hati. Bagian yang paling menakutkan adalah, itu membentuk produk dari 2 set. Jadi, tanpa membatasi hasil dalam klausa WHERE, Tabel1 dengan 1000 catatan CROSS JOIN dengan Table2 dengan 1.000.000 catatan akan menjadi 1.000.000.000 catatan. Akibatnya, banyak halaman yang harus dibaca oleh SQL Server.

Sebagai contoh, pertimbangkan untuk memasangkan karyawan pria dan wanita di AdventureWorks .

USE AdventureWorks
GO

SELECT
 P.LastName + ISNULL(' ' + p.Suffix,'') + ', ' + P.FirstName + ISNULL(' ' + P.MiddleName,'') AS Male
,P1.LastName + ISNULL(' ' + p1.Suffix,'') + ', ' + P1.FirstName + ISNULL(' ' + P1.MiddleName,'') AS Female
FROM HumanResources.Employee e
INNER JOIN Person.Person p ON e.BusinessEntityID = P.BusinessEntityID
CROSS JOIN HumanResources.Employee e1
INNER JOIN Person.Person p1 ON e1.BusinessEntityID = p1.BusinessEntityID
WHERE e.Gender = 'M'
AND e1.Gender = 'F' 

Kode di atas memberi Anda semua kemungkinan pasangan karyawan pria dan wanita. Saya hanya mendapatkan 17.304 catatan, tetapi lihat pembacaan logis pada Gambar 4:

Apakah Anda melihat pembacaan logis dari Orang meja? Itu membaca halaman 53.268 x 8KB! Belum lagi Meja Kerja pembacaan logis dilakukan di tempdb .

Kesimpulannya? Periksa STATISTICS IO, dan jika Anda kesulitan melihat pembacaan logis yang besar, ekspresikan kueri secara berbeda. Kondisi tambahan dalam klausa WHERE atau pendekatan membagi-dan-menaklukkan dapat membantu.

Ketika CROSS JOIN Menjadi INNER JOIN

Ya itu betul. SQL Server dapat memproses CROSS JOIN sebagai INNER JOIN. Kami telah menyebutkan sebelumnya bahwa ketika RIGHT JOIN diproses sebagai LEFT JOIN, itu dapat berlaku untuk CROSS JOIN. Lihat kode di bawah ini:

SELECT
 c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
CROSS JOIN Person.Person p
WHERE c.PersonID = P.BusinessEntityID 

Sebelum kita memeriksa Rencana Eksekusi, mari kita miliki yang setara dengan INNER JOIN.

SELECT
 c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
INNER JOIN Person.Person p ON c.PersonID = P.BusinessEntityID 

Sekarang, periksa Rencana Eksekusi di bawah ini.

Paket teratas adalah kueri menggunakan CROSS JOIN. Rencana bawah adalah kueri menggunakan INNER JOIN. Mereka memiliki QueryHashPlan . yang sama .

Apakah Anda memperhatikan Hash Match operator rencana teratas? Ini adalah INNER JOIN. Tapi kami menggunakan kode CROSS JOIN. Klausa WHERE dalam kueri pertama (WHERE c.PersonID =P.BusinessEntityID ) memaksa hasil untuk memiliki kombinasi hanya dengan kunci yang sama. Jadi, secara logika ini adalah INNER JOIN.

Mana yang lebih baik? Ini adalah pilihan pribadi Anda. Saya lebih suka INNER JOIN karena tujuannya adalah untuk menggabungkan 2 tabel dengan kunci yang sama. Menggunakan INNER JOIN membuatnya sangat jelas. Tapi itu hanya saya.

Kesimpulan

CROSS JOIN bagus untuk memberi Anda semua kemungkinan kombinasi nilai. Anda telah diperingatkan, bagaimanapun, bahwa itu dapat menyebabkan semacam "ledakan" data. Gunakan GABUNG ini dengan hati-hati. Batasi hasil sebanyak yang Anda bisa. Anda juga dapat menulis CROSS JOIN yang secara fungsional setara dengan INNER JOIN.

Artikel ini mengakhiri seri tentang SQL JOINs. Untuk referensi di masa mendatang, Anda dapat mem-bookmark artikel ini. Atau, tambahkan ke koleksi Anda di browser.

Dan jangan lupa untuk membagikan artikel ini ke media sosial favorit Anda?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Notasi Barker

  2. 115 Pertanyaan Wawancara SQL Teratas yang Harus Anda Siapkan Di 2022

  3. Cara Membuat Dokumen Excel dari Program Java Menggunakan Apache POI

  4. Pengantar IRI Voracity (Manajemen Data Total) [video]

  5. Paket Hosting di Chocolatey