Saya telah melihat CROSS / OUTER APPLY
dengan seorang kolega dan kami berjuang untuk menemukan contoh kehidupan nyata tentang di mana menggunakannya.
Saya telah menghabiskan cukup banyak waktu untuk melihat Kapan saya harus menggunakan Cross Apply daripada Inner Join? dan googling tetapi contoh utama (satu-satunya) tampaknya cukup aneh (menggunakan rowcount dari tabel untuk menentukan berapa banyak baris yang harus dipilih dari tabel lain).
Saya pikir skenario ini mungkin mendapat manfaat dari OUTER APPLY
:
Tabel Kontak (berisi 1 record untuk setiap kontak) Tabel Entri Komunikasi (dapat berisi n telepon, fax, email dari setiap kontak)
Tetapi menggunakan subkueri, ekspresi tabel umum, OUTER JOIN
dengan RANK()
dan OUTER APPLY
semua tampaknya bekerja sama. Saya menduga ini berarti skenario tersebut tidak berlaku untuk APPLY
.
Harap bagikan beberapa contoh kehidupan nyata dan bantu menjelaskan fitur tersebut!
sumber
Jawaban:
Beberapa kegunaannya
APPLY
adalah ...1) N teratas per kueri grup (bisa lebih efisien untuk beberapa kardinalitas)
2) Memanggil Fungsi Nilai Tabel untuk setiap baris di kueri luar
3) Menggunakan kembali alias kolom
4) Memisahkan lebih dari satu grup kolom
Mengasumsikan 1NF melanggar struktur tabel ....
Contoh menggunakan
VALUES
sintaks 2008+ .Pada tahun 2005
UNION ALL
bisa digunakan sebagai gantinya.sumber
Ada berbagai situasi di mana Anda tidak dapat menghindari
CROSS APPLY
atauOUTER APPLY
.Anggaplah Anda memiliki dua tabel.
TABEL MASTER
TABEL DETAIL
Ada banyak situasi di mana kita perlu mengganti
INNER JOIN
denganCROSS APPLY
.1. Jika kita ingin menggabungkan 2 tabel pada
TOP n
hasil denganINNER JOIN
fungsionalitasPertimbangkan apakah kita perlu memilih
Id
danName
dariMaster
dan dua tanggal terakhir untuk masing-masingId
dariDetails table
.Kueri di atas menghasilkan hasil sebagai berikut.
Lihat, itu menghasilkan hasil untuk dua tanggal terakhir dengan dua tanggal terakhir
Id
dan kemudian menggabungkan catatan ini hanya di kueri luar padaId
, yang salah. Untuk mencapai ini, kita perlu menggunakanCROSS APPLY
.dan bentuk dia mengikuti hasil.
Inilah pekerjaannya. Kueri di dalam
CROSS APPLY
bisa mereferensikan tabel luar, di manaINNER JOIN
tidak bisa melakukan ini (melempar kesalahan kompilasi). Saat menemukan dua tanggal terakhir, penggabungan dilakukan di dalamCROSS APPLY
yaituWHERE M.ID=D.ID
.2. Saat kita membutuhkan
INNER JOIN
fungsionalitas menggunakan fungsi.CROSS APPLY
dapat digunakan sebagai penggantiINNER JOIN
ketika kita membutuhkan hasil dariMaster
tabel dan afunction
.Dan inilah fungsinya
yang menghasilkan hasil sebagai berikut
1. Jika kita ingin menggabungkan 2 tabel pada
TOP n
hasil denganLEFT JOIN
fungsionalitasPertimbangkan jika kita perlu memilih Id dan Nama dari
Master
dan dua tanggal terakhir untuk setiap Id dariDetails
tabel.yang membentuk hasil sebagai berikut
Ini akan membawa hasil yang salah, yaitu hanya akan membawa dua data tanggal terakhir dari
Details
tabel terlepas dariId
meskipun kita bergabungId
. Jadi solusi yang tepat adalah menggunakanOUTER APPLY
.yang membentuk hasil yang diinginkan berikut
2. Saat kita membutuhkan
LEFT JOIN
fungsionalitas menggunakanfunctions
.OUTER APPLY
dapat digunakan sebagai penggantiLEFT JOIN
ketika kita membutuhkan hasil dariMaster
tabel dan afunction
.Dan fungsinya di sini.
yang menghasilkan hasil sebagai berikut
CROSS APPLY
atauOUTER APPLY
dapat digunakan untuk mempertahankanNULL
nilai saat tidak berputar, yang dapat dipertukarkan.Pertimbangkan Anda memiliki tabel di bawah ini
Saat Anda menggunakan
UNPIVOT
untuk membawaFROMDATE
DANTODATE
ke satu kolom, ini akan menghilangkanNULL
nilai secara default.yang menghasilkan hasil di bawah ini. Perhatikan bahwa kami melewatkan rekor
Id
nomor3
Dalam kasus seperti itu, a
CROSS APPLY
atauOUTER APPLY
akan bergunayang membentuk hasil berikut dan mempertahankan di
Id
mana nilainya3
sumber
Salah satu contoh nyata adalah jika Anda memiliki penjadwal dan ingin melihat entri log terbaru apa untuk setiap tugas terjadwal.
sumber
Untuk menjawab point diatas ketuk contoh:
Dan sekarang jalankan dua kueri dengan rencana eksekusi.
Anda dapat melihat bahwa kueri penerapan luar lebih efisien. (Tidak dapat melampirkan paket karena saya adalah pengguna baru ... Doh.)
sumber