Saya memiliki kueri yang menggunakan WHERE
klausa, dan saya kebetulan menggunakan WHERE
klausa yang sama persis di banyak pertanyaan pada tabel ini (et al).
Pertanyaannya adalah:
SELECT
DATENAME(DW, [AtDateTime]) AS [Day of Week]
,COUNT(*) AS [Number of Searches]
,CAST(CAST(COUNT(*) AS DECIMAL(10, 2))
/ COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2))
AS [Average Searches per Day]
,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS [Number of Searches with no Results]
,CAST(CAST(SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS DECIMAL(10, 2)) / COUNT(*) AS DECIMAL(10, 4))
AS [Percent of Searches with no Results]
FROM [DB].[dbo].[SearchHistory]
WHERE
[CustomerNumber] <> '1234' AND [CustomerNumber] <> '5678'
GROUP BY DATENAME(DW, [AtDateTime]), DATEPART(DW, [AtDateTime])
ORDER BY DATEPART(DW, [AtDateTime])
Bagian yang ingin saya ubah adalah WHERE
klausa, sebagai gantinya memungkinkan saya untuk menggunakan tabel sehingga jika saya harus menambahkan nomor pelanggan untuk diabaikan, saya tidak perlu memperbarui semua pertanyaan saya. (Dan ada beberapa pertanyaan yang memiliki WHERE
klausa yang sama ini .)
sql-server
sql-server-2012
t-sql
where
Der Kommissar
sumber
sumber
Jawaban:
Buat tabel untuk menahan nomor pelanggan yang akan dikecualikan, lalu kecualikan baris tersebut menggunakan a
NOT EXISTS
dalamWHERE
klausa.sumber
Sekarang
WHERE
klausa Anda di semua pertanyaan menjadi:sumber
Ada pertanyaan / potensi masalah penting dengan pendekatan yang Anda usulkan. Yang pasti, Anda dapat mengecualikan cukup mudah melalui tabel kerja 'Pengecualian Nomor Pelanggan':
Tapi sekarang, apa yang disebut "parameter kueri" - sepenuhnya dinamis & independen, per-kueri, dan per-pengguna - berubah menjadi "status persisten yang dibagi bersama dalam basis data".
Beberapa pertanyaan & poin yang relevan:
haruskah informasi Pengecualian Pelanggan terpisah, per-Pengguna atau per-Sesi? Anda dapat menambahkan parameter 'SessionID' untuk membedakannya, tetapi pada dasarnya Anda membuat ulang pola "Work Table" lama.
mungkin klausa NOT IN (...) bisa lebih disukai? yang dapat diparameterisasi secara dinamis, hingga batas 2.100 parameter.
mungkin mengunjungi kembali kode / infrastruktur Anda untuk membangun kueri & mengikat parameter, jika saat ini Anda mengandalkan nomor parameter tetap; meningkatkan ini akan memungkinkan modularitas & penggunaan klausa IN or NOT IN (?,?,? ..) dengan jumlah parameter variabel.
Pendekatan yang disarankan:
Dengan binding '1234', '5678', '6789' dll ke parameter NOT IN () & parameter kueri logis berikutnya terikat ke penomoran yang sesuai secara dinamis.
sumber