Saya sudah mulai membaca tentang Common Table Expression dan tidak bisa memikirkan use case di mana saya perlu menggunakannya. Mereka tampaknya berlebihan karena hal yang sama dapat dilakukan dengan tabel turunan. Apakah ada sesuatu yang saya lewatkan atau tidak pahami dengan baik? Dapatkah seseorang memberi saya contoh sederhana dari batasan dengan kueri pemilihan, turunan, atau temp sementara untuk membuat kasus CTE? Setiap contoh sederhana akan sangat dihargai.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Saya menggunakannya untuk memecah kueri kompleks, terutama gabungan dan sub-kueri kompleks. Saya menemukan saya semakin sering menggunakannya sebagai 'pseudo-view' untuk membantu saya memahami maksud dari query.
Satu-satunya keluhan saya tentang mereka adalah mereka tidak dapat digunakan kembali. Sebagai contoh, saya mungkin memiliki proc tersimpan dengan dua pernyataan pembaruan yang bisa menggunakan CTE yang sama. Tetapi 'ruang lingkup' CTE adalah permintaan pertama saja.
Masalahnya adalah, 'contoh sederhana' mungkin tidak benar-benar membutuhkan CTE!
Tetap saja, sangat berguna.
sumber
VIEW
:)Ada dua alasan mengapa saya menggunakan cte's.
Untuk menggunakan nilai yang dihitung dalam klausa tempat. Bagi saya ini agak lebih bersih daripada tabel turunan.
Misalkan ada dua tabel - Pertanyaan dan Jawaban digabungkan oleh Pertanyaan.ID = Answers.Question_Id (dan id kuis)
Inilah contoh lain di mana saya ingin mendapatkan daftar pertanyaan dan jawaban. Saya ingin Jawaban dikelompokkan dengan pertanyaan dalam hasil.
sumber
HAVING
adalah cara lain untuk melakukan filter tahap akhir yang dapat mirip dengan menggunakan subSELECT
Salah satu skenario yang saya temukan berguna untuk menggunakan CTE adalah ketika Anda ingin mendapatkan baris data yang berbeda berdasarkan pada satu atau lebih kolom tetapi kembalikan semua kolom dalam tabel. Dengan kueri standar, Anda mungkin harus terlebih dahulu membuang nilai-nilai yang berbeda ke tabel temp dan kemudian mencoba untuk menggabungkannya kembali ke tabel asli untuk mengambil sisa kolom atau Anda dapat menulis kueri partisi yang sangat kompleks yang dapat mengembalikan hasil dalam sekali jalan tetapi kemungkinan besar, itu tidak akan bisa dibaca dan menyebabkan masalah kinerja.
Tetapi dengan menggunakan CTE (seperti dijawab oleh Tim Schmelter pada Pilih contoh pertama dari sebuah rekaman )
Seperti yang Anda lihat, ini jauh lebih mudah dibaca dan dipelihara. Dan dibandingkan dengan pertanyaan lain, kinerjanya jauh lebih baik.
sumber
Mungkin lebih bermakna untuk menganggap CTE sebagai pengganti tampilan yang digunakan untuk satu permintaan. Tetapi tidak memerlukan overhead, metadata, atau kegigihan dari pandangan formal. Sangat berguna saat Anda perlu:
Inilah contoh cut-and-paste untuk dimainkan:
Nikmati
sumber
Hari ini kita akan belajar tentang ekspresi tabel umum yang merupakan fitur baru yang diperkenalkan di SQL server 2005 dan tersedia dalam versi yang lebih baru juga.
Ekspresi tabel umum: - Ekspresi tabel umum dapat didefinisikan sebagai hasil sementara yang ditetapkan atau dengan kata lain sebagai pengganti tampilan dalam SQL Server. Ekspresi tabel umum hanya valid dalam kumpulan pernyataan yang didefinisikan dan tidak dapat digunakan dalam sesi lain.
Sintaks menyatakan CTE (ekspresi tabel umum): -
Mari kita ambil contoh: -
Saya telah membuat dua tabel karyawan dan Departemen dan memasukkan 5 baris di setiap tabel. Sekarang saya ingin bergabung dengan tabel ini dan membuat hasil sementara yang diatur untuk menggunakannya lebih lanjut.
Mari kita ambil setiap baris pernyataan satu per satu dan mengerti.
Untuk mendefinisikan CTE kita menulis klausa "dengan", lalu kita beri nama untuk ekspresi tabel, di sini saya telah memberikan nama sebagai "CTE_Example"
Kemudian kita menulis "Sebagai" dan melampirkan kode kita dalam dua tanda kurung (---), kita dapat bergabung dengan beberapa tabel dalam tanda kurung terlampir.
Pada baris terakhir, saya telah menggunakan "Select * from CTE_Example", kita merujuk ekspresi tabel Common di baris terakhir kode, Jadi kita dapat mengatakan bahwa ini seperti tampilan, di mana kita mendefinisikan dan menggunakan tampilan dalam satu batch dan CTE tidak disimpan dalam database sebagai objek permanen. Tapi itu berperilaku seperti pandangan. kita dapat melakukan hapus dan perbarui pernyataan pada CTE dan itu akan berdampak langsung pada tabel yang direferensikan yang sedang digunakan dalam CTE. Mari kita ambil contoh untuk memahami fakta ini.
Dalam pernyataan di atas kami menghapus baris dari CTE_Example dan itu akan menghapus data dari tabel yang direferensikan "DEPT" yang sedang digunakan dalam CTE.
sumber
Ini sangat berguna ketika Anda ingin melakukan "pembaruan yang dipesan".
MS SQL tidak memungkinkan Anda untuk menggunakan ORDER BY dengan UPDATE, tetapi dengan bantuan CTE Anda dapat melakukannya dengan cara itu:
Lihat di sini untuk info lebih lanjut: Cara memperbarui dan memesan dengan menggunakan ms sql
sumber
Satu hal yang belum ditunjukkan, adalah kecepatan . Saya tahu ini adalah pertanyaan lama yang dijawab, tetapi saya pikir ini layak mendapat komentar / jawaban langsung:
Ketika saya menggunakan CTE pertama kali saya benar-benar terpana oleh kecepatannya. Itu adalah kasus seperti dari buku teks, sangat cocok untuk CTE, tetapi di semua kesempatan saya pernah menggunakan CTE, ada peningkatan kecepatan yang signifikan. Permintaan pertama saya rumit dengan tabel turunan, membutuhkan waktu beberapa menit untuk dieksekusi. Dengan CTE, butuh waktu sepersekian detik dan membuat saya kaget, itu bahkan mungkin.
sumber
coba ini
sumber