Memahami Had SQL Server pada Fungsi Tetingkap di WHERE Klausa
Fungsi tetingkap tidak ternilai untuk analisis data, memberikan keupayaan yang berkuasa untuk pengiraan merentas set hasil. Walau bagaimanapun, SQL Server secara eksplisit melarang penggunaannya dalam klausa WHERE. Sekatan ini tidak sewenang-wenangnya; ia adalah akibat langsung daripada perintah pemprosesan pertanyaan pangkalan data.
SQL Server menilai fungsi tetingkap selepas klausa WHERE, JOIN, GROUP BY dan HAVING telah menyelesaikan pemprosesannya (langkah 5.1 dalam pelan pelaksanaan). Penjujukan ini memperkenalkan kesamaran jika fungsi tetingkap dibenarkan dalam klausa WHERE.
Bayangkan jadual dengan nilai ['A', 'B', 'C', 'D', 'E', 'F']. Pertanyaan seperti ini:
<code class="language-sql">SELECT col1 FROM T1 WHERE ROW_NUMBER() OVER (ORDER BY col1) > 1</code>
menimbulkan soalan kritikal: patutkah ROW_NUMBER()
dikira sebelum atau selepas penapisan? Perintah itu memberi kesan ketara kepada hasilnya. Kekaburan yang wujud ini adalah sebab sekatan.
Untuk mengatasi had ini, pembangun boleh menggunakan Ungkapan Jadual Biasa (CTE) atau subkueri dengan berkesan. Pembinaan ini membenarkan fungsi tetingkap dikira terlebih dahulu, dan hasilnya digunakan untuk menapis dalam klausa WHERE berikutnya. Memahami pilihan reka bentuk ini memberikan gambaran yang lebih jelas tentang model pelaksanaan pertanyaan SQL Server.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Fungsi Tetingkap dalam SQL Server WHERE Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!