Mogę myśleć o kilka opcji:
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: Dynamiczne 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 i podzapytanie.
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
W tym ostatnim przypadku należy sprawdzić plan, jaki tworzy optymalizator, aby sprawdzić, czy jego wydajność jest odpowiednia.
Wygląda na to, że szukasz ponownego użycia kodu, więc może opcja 2 jest najlepsza. T-SQL tak naprawdę nie nadaje się do tego rodzaju polimorfizmu, ale w niektórych przypadkach można użyć obejścia.
Cofając się, jedno pytanie, które należy zadać, to, czy stoły mają taką samą strukturę, może powinieneś po prostu użyć jednej tabeli? Następnie możesz użyć @Parameter
, aby odfiltrować żądane wiersze zamiast próbować tworzyć zapytania dynamiczne.
Warto również zauważyć, że w takich sytuacjach można obsłużyć generowanie kodu w warstwie aplikacji za pomocą ORM i tym podobnych.
Dzięki Ian, faktycznie struktura tabeli jest taka sama, ale danych jest różny w zależności od stanu, 'Table2' jest rzeczywista tabela z bazy danych, podczas gdy' Table3' jest stół wrócił z funkcji o tej samej strukturze –
@PawanNogariya, wystarczająco dobrze, odpowiada na pytanie o łączenie rzeczy w jeden stół. Cała reszta ma zastosowanie - dodałem też inną opcję, używając "UNION ALL", aby połączyć je w jedno podzapytanie do wykorzystania w pozostałej części zapytania. Mam nadzieję, że przynajmniej jeden pomoże! –