SQL Server JOIN dan Penyata KES: Satu Perangkap Biasa
Dalam SQL Server 2008 R2 (dan versi terkemudian), cubaan menggunakan pernyataan CASE
terus dalam keadaan JOIN
untuk mentakrifkan kriteria gabungan boleh membawa kepada ralat sintaks. Mari kita periksa sebab dan cara untuk menyelesaikannya.
Pertimbangkan hubungan antara sys.partitions
dan sys.allocation_units
, di mana gabungan bergantung pada nilai sys.allocation_units.type
. Pendekatan naif mungkin kelihatan seperti ini:
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
Ini mengakibatkan ralat "Sintaks salah berhampiran '='". Masalahnya ialah ungkapan CASE
itu sendiri tidak menghasilkan hasil Boolean (BENAR/PALSU) yang sesuai untuk keadaan gabungan. Sebaliknya, ia mengembalikan sama ada a.container_id = p.hobt_id
atau a.container_id = p.partition_id
, yang mana kedua-duanya bukan syarat cantum yang sah dengan sendirinya.
Pendekatan yang Betul: Penilaian Boolean
Untuk membetulkannya, kami memerlukan ungkapan CASE
untuk menghasilkan nilai Boolean. Kita boleh mencapai ini dengan menstrukturkan pernyataan CASE
untuk mengembalikan 1 untuk benar dan 0 untuk palsu, dan kemudian membandingkan hasilnya dengan 1:
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
Sekarang, pernyataan CASE
menilai kepada 1 hanya apabila keadaan yang sesuai (berdasarkan a.type
) dan semakan kesaksamaan (a.container_id = p.hobt_id
atau a.container_id = p.partition_id
) adalah kedua-duanya benar. Perbandingan = 1
kemudian memberikan hasil Boolean yang diperlukan untuk keadaan JOIN
. Pertanyaan yang disemak ini bergabung dengan jadual dengan betul. Kaedah ini memastikan bahawa keadaan JOIN
dinilai kepada nilai benar atau salah, membolehkan cantuman berfungsi seperti yang dimaksudkan.
Atas ialah kandungan terperinci Bolehkah Penyata KES Digunakan dalam Keadaan JOIN dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!