Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

jika lain dalam CTE?

coba:

;with CTE_AorB
(
    select * from table_A WHERE (condition true)
    union all
    select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
   select * from CTE_AorB // processing is removed
)

kunci dengan kondisi pencarian dinamis adalah memastikan indeks digunakan, Berikut adalah artikel yang sangat komprehensif tentang cara menangani topik ini:

Kondisi Penelusuran Dinamis di T-SQL oleh Erland Sommarskog

itu mencakup semua masalah dan metode mencoba menulis kueri dengan beberapa kondisi pencarian opsional. Hal utama yang perlu Anda perhatikan bukanlah duplikasi kode, tetapi penggunaan indeks. Jika kueri Anda gagal menggunakan indeks, itu akan menjadi buruk. Ada beberapa teknik yang dapat digunakan, yang memungkinkan atau tidak mengizinkan indeks untuk digunakan.

ini daftar isinya :

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

jika Anda menggunakan versi SQL Server 2008, ada teknik tambahan yang dapat digunakan, lihat:Kondisi Penelusuran Dinamis dalam Versi T-SQL untuk SQL 2008 (SP1 CU5 dan yang lebih baru)

Jika Anda menggunakan rilis SQL Server 2008, Anda dapat menambahkan OPTION (RECOMPILE) ke kueri dan nilai variabel lokal pada waktu proses digunakan untuk pengoptimalan.

Pertimbangkan ini, OPTION (RECOMPILE) akan mengambil kode ini (di mana tidak ada indeks yang dapat digunakan dengan kekacauan OR . ini s):

WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

dan optimalkan saat dijalankan (asalkan hanya @Search2 yang diteruskan dengan nilai):

WHERE
    [email protected]

dan indeks dapat digunakan (jika Anda memilikinya di Kolom2)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemikiran tentang SQL Server 2019 Editions

  2. memperbarui beberapa kolom menggunakan pernyataan kasus di sql server

  3. cara menemukan ukuran baris dalam tabel

  4. Sisipkan Masalah Konkurensi - Lingkungan Multithreaded

  5. Bagaimana cara membuat tabel menggunakan kueri pemilihan di SQL Server?