sql >> Databáze >  >> RDS >> Sqlserver

pokud jinak v rámci CTE?

zkuste:

;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
)

klíčem k podmínkám dynamického vyhledávání je zajistit, aby byl použit index. Zde je velmi obsáhlý článek o tom, jak zacházet s tímto tématem:

Podmínky dynamického vyhledávání v T-SQL od Erlanda Sommarskoga

pokrývá všechny problémy a metody pokusu o psaní dotazů s více volitelnými podmínkami vyhledávání. Tou hlavní věcí, o kterou se musíte starat, není duplikace kódu, ale použití indexu. Pokud váš dotaz selže při použití indexu, provede se špatně. Existuje několik technik, které lze použít a které mohou nebo nemusí umožnit použití indexu.

zde je obsah:

  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

pokud používáte správnou verzi SQL Server 2008, existuje další technika, kterou lze použít, viz:Podmínky dynamického vyhledávání ve verzi T-SQL pro SQL 2008 (SP1 CU5 a novější)

Pokud používáte správné vydání SQL Server 2008, stačí přidat OPTION (RECOMPILE) na dotaz a pro optimalizace se použije hodnota lokální proměnné za běhu.

Zvažte toto, OPTION (RECOMPILE) převezme tento kód (kde nelze použít žádný index s touto změtí OR s):

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

a optimalizovat jej za běhu tak, aby byl (za předpokladu, že byl předán pouze @Search2 s hodnotou):

WHERE
    [email protected]

a lze použít index (pokud ho máte definovaný ve sloupci 2)



  1. V SQL Server 2008 jsem schopen předat parametr s hodnotou tabulky do mé uložené procedury z NHibernate.Jak dosáhnout stejného v Oracle

  2. Jak obnovit soubor výpisu PostgreSQL do databází Postgres?

  3. Jak správně vyčistím data přijatá z textové oblasti při jejich výstupu zpět do textové oblasti?

  4. Výjimka Java JDBC MySQL:Operace není povolena po uzavření ResultSet