SQL Server JOIN Syarat dan Penyata KES: Pandangan Lebih Dekat
Apabila bekerja dengan paparan sistem Microsoft SQL Server 2008 R2, seperti sys.partitions
dan sys.allocation_units
, hubungan antara mereka selalunya bergantung pada nilai sys.allocation_units.type
. Pendekatan biasa untuk menyertai jadual ini mungkin melibatkan pernyataan CASE
dalam keadaan JOIN
.
Mari kita periksa senario ini: Menyambung sys.indexes
, sys.partitions
dan sys.allocation_units
memerlukan gabungan bersyarat berdasarkan allocation_units.type
. Percubaan awal 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, bagaimanapun, mengakibatkan ralat sintaks. Isu ini berpunca daripada fakta bahawa CASE
pernyataan dalam SQL Server menghasilkan nilai skalar, bukan pernyataan boleh laku. Mereka tidak boleh mengawal perbandingan kesaksamaan secara langsung dalam klausa JOIN
.
Penyelesaian: Penilaian Boolean dengan KES
Untuk menyelesaikan masalah ini, kita perlu menyusun semula pernyataan CASE
untuk mengembalikan nilai Boolean (1 untuk benar, 0 untuk palsu) yang kemudiannya boleh dibandingkan:
<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>
Dengan menggunakan AND
dalam klausa WHEN
dan membandingkan ungkapan CASE
yang terhasil kepada 1, kami mencipta gabungan bersyarat dengan berkesan. Ini menunjukkan bahawa walaupun penyataan CASE
berkuasa, penggunaannya dalam keadaan JOIN
memerlukan pertimbangan yang teliti terhadap jenis pemulangannya dan keperluan untuk penilaian Boolean yang jelas. Tugasan langsung atau ujian kesaksamaan dalam CASE
pernyataan itu sendiri dalam JOIN
tidak disokong.
Atas ialah kandungan terperinci Bolehkah Penyata KES Digunakan Secara Terus dalam Keadaan JOIN dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!