Как выбрать из таблицы A или таблицы B на основе значения без использования оператора If - PullRequest
0 голосов
/ 08 марта 2019

Пример:

Declare @Division int = 1

IF @Division = 1 
BEGIN 
    SELECT * FROM A 
END 
ELSE IF @Division = 2 
BEGIN 
    SELECT * FROM B 
END

Дело в том, что я не хочу использовать if statements, так как есть сотни Divisions для рассмотрения.

Это частьзапрос большего размера, где он объединен с другими таблицами.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Если таблицы имеют одинаковые столбцы, вы можете сделать UNION ALL:

declare @Division int = 1

SELECT * FROM A WHERE @Division = 1
UNION ALL
SELECT * FROM B WHERE @Division = 2
-- etc

Или, если они не имеют точно такие же столбцы, но можно собрать все интересные столбцыот каждой, тогда может работать более расширенная версия:

SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc

Я не уверен, однако, насколько эффективен все это будет, по сравнению с вашей первоначальной версией, которая использует IF.

Вы также можете поместить все это в CTE для легкого объединения с другими таблицами:

;WITH DivisionCTE (ID, VALUE, DESCR) AS
(
    SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
    UNION ALL
    SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
    -- etc
)
SELECT *
FROM       DivisionCTE x
INNER JOIN OtherTable  y ON x.ID = Y.ID
-- etc
1 голос
/ 08 марта 2019

Просто создайте представление по всем необходимым таблицам по Union

создать представление DivisionWiseData как начать выберите *, 1 AS Отделение от tabA союз выберите *, 2 AS Division из tabB и так далее ...

после этого просто используйте выберите * из dbo.DivisionWiseData, где Divisionid = @ Divisionid

...