Seperti yang ditunjukkan dalam Menggunakan Common Table Expressions pada MSDN, Anda dapat mendefinisikan CTE sebagai:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
dan gunakan seperti:
SELECT <column_list> FROM expression_name;
Katakanlah saya sudah mengikuti 2 CTE
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Kueri menampilkan hasil yang sama untuk kedua CTE karena kueri dalam sama. Satu-satunya perbedaan antara keduanya adalah bahwa cte2 memiliki nama kolom ( (name)
) yang didefinisikan dalam deklarasi.
Ketika saya menjalankan kedua CTE, saya tidak melihat perbedaan dalam rencana eksekusi.
Saya hanya ingin tahu:
- Apa bedanya jika saya tidak menentukan nama kolom dalam definisi CTE?
- Mengapa saya harus / tidak menentukan nama kolom saat membuat CTE?
- Apakah ini memengaruhi rencana eksekusi permintaan? (Sejauh yang saya lihat, tidak ada bedanya.)
sumber
Secara anekdot, saya lebih suka memberi nama kolom di dalam CTE daripada di dalam klausa
WITH CTE (xxx) AS
1 karena Anda tidak akan pernah secara tidak sengaja salah mencocokkan nama vs isi kolom.Ambil contoh sebagai berikut:
Apa yang ditampilkan ini? Ini menunjukkan isi
y
kolom di bawah judulx
, dan isix
kolom di bawah juduly
.Dengan realisasi ini, saya tidak pernah menentukan nama kolom dalam
(xxx) AS
klausa, sebaliknya saya melakukannya seperti ini:Ini menghilangkan semua keraguan tentang apa definisi kolom itu.
Pada nota yang sama sekali tidak terkait; selalu tentukan nama skema saat merujuk nama objek , dan akhiri pernyataan Anda dengan tanda titik koma .
sumber
Pada akhirnya setiap kolom membutuhkan nama yang valid dan Anda dapat menetapkannya dengan dua cara:
Daftar kolom
Menggunakan nama atau alias kolom asli
Ketika Anda melakukan kedua alias dan daftar kolom
Keduanya daftar kolom & alias
Ini mirip dengan definisi Lihat atau Tabel yang Diperoleh, tempat Anda dapat menentukan daftar nama kolom juga.
daftar kolom : Ketika Anda memiliki banyak perhitungan yang kompleks, lebih mudah untuk menemukan nama, karena mereka tidak tersebar melalui kode sumber. Dan lebih mudah jika Anda mendapat cyt rekursif dan Anda dapat menetapkan dua nama berbeda untuk kolom yang sama di # 3.
nama asli / alias : Anda hanya perlu menetapkan alias jika Anda melakukan perhitungan atau ingin / harus mengganti nama kolom
sumber
SomeAlias = SomeFunction(SomeColumn)
, dengan hanya satu definisi kolom per baris. Ini memungkinkan pemindaian sederhana di sisi kiri daftar kolom untuk menemukan yang Anda cari.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Sekarang setelah Anda membahasnya, saya memikirkan skenario sepertiCREATE VIEW MyView (G) AS WITH cte (C) AS (SELECT A AS B FROM MyTable) SELECT E AS F FROM (SELECT C AS D FROM cte) AS s (E);
- betapa menyenangkannya debug itu!