sql >> Database >  >> RDS >> Sqlserver

indien anders binnen CTE?

probeer:

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

de sleutel met een dynamische zoekvoorwaarde is om ervoor te zorgen dat een index wordt gebruikt. Hier is een zeer uitgebreid artikel over hoe u met dit onderwerp omgaat:

Dynamische zoekvoorwaarden in T-SQL door Erland Sommarskog

het behandelt alle problemen en methoden om zoekopdrachten te schrijven met meerdere optionele zoekvoorwaarden. Het belangrijkste waar u zich zorgen over moet maken, is niet het dupliceren van code, maar het gebruik van een index. Als uw query geen index gebruikt, wordt deze slecht uitgevoerd. Er zijn verschillende technieken die kunnen worden gebruikt, waarbij wel of niet een index kan worden gebruikt.

hier is de inhoudsopgave:

  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

als u de juiste versie van SQL Server 2008 gebruikt, is er een extra techniek die kan worden gebruikt, zie:Dynamische zoekvoorwaarden in T-SQL-versie voor SQL 2008 (SP1 CU5 en hoger)

Als u de juiste versie van SQL Server 2008 gebruikt, kunt u gewoon OPTION (RECOMPILE) toevoegen naar de query en de waarde van de lokale variabele tijdens runtime wordt gebruikt voor de optimalisaties.

Overweeg dit, OPTION (RECOMPILE) zal deze code nemen (waar geen index kan worden gebruikt met deze puinhoop van OR s):

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

en optimaliseer het tijdens runtime (op voorwaarde dat alleen @Search2 werd doorgegeven met een waarde):

WHERE
    [email protected]

en een index kan worden gebruikt (als je er een hebt gedefinieerd op Kolom 2)



  1. Hoe werkt numerieke vergelijking op de Oracle VARCHAR-kolom?

  2. Een Oracle-functie aanroepen vanuit Java

  3. Hoe selecteer ik twee extra kolommen uit een andere tabel op basis van waarden in de hoofdtabel?

  4. Activex ListView Control-zelfstudie-01