mi viene in mente un paio di opzioni:
1: IF ... ELSE
IF @Parameter IS NULL
SELECT *
FROM T1
INNER JOIN T2 ON T1.ID = T2.ID
ELSE
SELECT *
FROM T1
INNER JOIN T3 ON T1.ID = T3.ID
2: dinamica T-SQL
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = N'SELECT *
FROM T1
INNER JOIN ' + CASE WHEN @Parameter IS NULL THEN N'T2 t' ELSE N'T3 t' END
+ N' ON T1.ID = t.ID';
EXEC sp_executesql @SQL;
3: UNION ALL e sottoquery.
SELECT *
FROM T1
INNER JOIN
(
SELECT *
FROM T2
WHERE @Parameter IS NULL
UNION ALL
SELECT *
FROM T3
WHERE @Parameter IS NOT NULL
) t ON T1.ID = t.ID
Per quest'ultimo ci si controlla il piano l'ottimizzatore crea per vedere se si tratta di prestazioni OK saggio.
Sembra che tu stia cercando il riutilizzo del codice, quindi forse l'opzione 2 è la migliore. T-SQL in realtà non si presta a questo tipo di polimorfismo, ma in alcuni casi è possibile utilizzare soluzioni alternative.
Facendo un passo indietro, una domanda da porsi è, se i tavoli hanno la stessa struttura, forse dovresti semplicemente usare una tabella? Quindi è possibile utilizzare @Parameter
per filtrare semplicemente le righe necessarie invece di provare a creare query dinamiche.
Vale anche la pena notare che in situazioni come questa è possibile gestire la generazione del codice a livello di applicazione con ORM e simili.
fonte
2013-04-13 15:57:08
Grazie Ian, in realtà la struttura della tabella è lo stesso ma i dati è diverso in base alle condizioni, 'Table2' è la tabella reale dal database mentre' Table3' è una tabella restituito da una funzione con la stessa struttura –
@PawanNogariya, abbastanza giusto, risponde alla domanda su come combinare le cose in un unico tavolo. Tutto il resto vale: ho aggiunto anche un'altra opzione, usando 'UNION ALL' per combinarli in una subquery da utilizzare nel resto della query. Spero che almeno uno aiuti! –