Menggunakan gabungan dalam
Jenis JOIN yang paling sering ada di kueri T-SQL adalah INNER JOIN. Gabungan dalam digunakan untuk memecahkan banyak masalah bisnis umum, terutama di lingkungan database yang sangat dinormalisasi. Untuk mengambil data yang telah disimpan di beberapa tabel, Anda sering perlu menggabungkannya melalui kueri INNER JOIN. INNER JOIN memulai fase pemrosesan logisnya sebagai produk Kartesius, yang kemudian difilter untuk menghapus baris apa pun yang tidak cocok dengan predikat tersebut.
Memproses INNER JOIN
Mari kita periksa langkah-langkah di mana SQL Server secara logis akan memproses kueri JOIN. Nomor baris dalam contoh hipotetis berikut ditambahkan untuk kejelasan:
1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp
3) JOIN Sales.SalesOrder AS ord
4) ON emp.EmployeeID = ord.EmployeeID;
Seperti yang harus Anda ketahui, klausul FROM akan diproses sebelum klausul SELECT. Mari kita lacak pemrosesan, dimulai dengan baris 2:
- Klausa FROM menentukan tabel HR.Employee sebagai salah satu tabel input dan memberikan alias emp.
- Operator JOIN di baris 3 mencerminkan penggunaan INNER JOIN (jenis default dalam T-SQL) dan menentukan Sales.SalesOrder sebagai tabel input lainnya, yang memiliki alias ord.
- SQL Server akan melakukan gabungan Kartesius logis di tabel ini dan meneruskan hasilnya sebagai tabel virtual ke langkah berikutnya. (Pemrosesan fisik kueri mungkin tidak benar-benar menjalankan operasi produk Cartesian, tergantung pada keputusan pengoptimal. Tetapi membayangkan produk Cartesian sedang dibuat dapat membantu.)
- Dengan menggunakan klausa ON, SQL Server akan memfilter tabel virtual, hanya menyimpan baris di mana nilai EmployeeID dari tabel emp cocok dengan EmployeeID dalam tabel ord .
- Baris yang tersisa ditinggalkan di tabel virtual dan diserahkan ke langkah berikutnya dalam pernyataan SELECT. Dalam contoh ini, tabel virtual selanjutnya diproses oleh klausul SELECT, dan dua kolom yang ditentukan akan ditampilkan ke aplikasi klien.
Hasil kueri yang diselesaikan adalah daftar karyawan dan jumlah pesanan mereka. Karyawan yang tidak memiliki pesanan terkait telah difilter oleh klausa ON, begitu pula pesanan yang memiliki EmployeeID yang tidak sesuai dengan entri di dalam tabel HR.Employee.
Sintaks INNER JOIN
INNER JOIN adalah jenis default JOIN, dan kata kunci INNER opsional implisit dalam klausul JOIN. Saat mencampur dan mencocokkan jenis gabungan, dapat berguna untuk menentukan jenis gabungan secara eksplisit, seperti yang ditunjukkan dalam contoh hipotetis ini:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Saat menulis kueri menggunakan gabungan dalam, pertimbangkan panduan berikut:
- Alias tabel lebih disukai, tidak hanya untuk daftar SELECT, tetapi juga untuk menulis klausul ON.
- Gabungan dalam dapat dilakukan pada satu kolom yang cocok, seperti OrderID, atau pada beberapa atribut yang cocok, seperti kombinasi OrderID dan ProductID. Gabungan yang menentukan beberapa kolom yang cocok disebut gabungan komposit .
- Urutan di mana tabel tercantum dalam klausul FROM untuk INNER JOIN tidak masalah bagi pengoptimal SQL Server. Secara konseptual, gabungan akan dievaluasi dari kiri ke kanan.
- Gunakan kata kunci JOIN sekali untuk setiap pasangan tabel yang digabungkan dalam daftar FROM. Untuk kueri dua tabel, tentukan satu gabungan. Untuk kueri tiga tabel, Anda akan menggunakan JOIN dua kali; sekali antara dua tabel pertama, dan sekali lagi antara output JOIN antara dua tabel pertama dan tabel ketiga.
Contoh INNER JOIN
Contoh hipotetis berikut melakukan gabungan pada satu kolom yang cocok, yang berkaitan dengan ProductModelID dalam tabel Production.Product dengan ProductModelID pada tabel Production.ProductModel :
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;
Contoh berikutnya ini memperlihatkan bagaimana gabungan dalam dapat diperluas untuk menyertakan lebih dari dua tabel. Tabel Sales.SalesOrderDetail digabungkan dengan output JOIN antara Production.Product dan Production.ProductModel. Setiap instans JOIN/ON melakukan populasi dan pemfilteran tabel output virtual sendiri. Pengoptimal kueri SQL Server menentukan urutan tempat gabungan dan pemfilteran akan dilakukan.
SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;