Я должен бороться с желанием уменьшить дублирование ... но, чувак, это действительно не подходит мне.
Будет ли это "чувствовать" лучше?
SELECT ... lots of columns and complicated stuff ...
FROM
(
SELECT MyPK
FROM TBooks
WHERE
(--...SOME CONDITIONS)
AND @AuthorType = 1 AND --...DIFFERENT CONDITIONS)
union all
SELECT MyPK
FROM TBooks
WHERE
(--...SOME CONDITIONS)
AND @AuthorType = 2 AND --...DIFFERENT CONDITIONS)
union all
...
) AS B1
JOIN TBooks AS B2
ON B2.MyPK = B1.MyPK
JOIN ... other tables ...
Псевдотаблица B1 - это просто предложение WHERE для получения PK. Затем он присоединяется к исходной таблице (и любым другим, которые необходимы), чтобы получить «представление». Это позволяет избежать дублирования столбцов презентации в каждом UNION ALL
Вы можете сделать еще один шаг и сначала вставить PK во временную таблицу, а затем соединить ее с другими таблицами для аспекта представления.
Мы делаем это для очень больших таблиц, где у пользователя есть множество вариантов того, к чему обращаться.
DECLARE @MyTempTable TABLE
(
MyPK int NOT NULL,
PRIMARY KEY
(
MyPK
)
)
IF @LastName IS NOT NULL
BEGIN
INSERT INTO @MyTempTable
(
MyPK
)
SELECT MyPK
FROM MyNamesTable
WHERE LastName = @LastName -- Lets say we have an efficient index for this
END
ELSE
IF @Country IS NOT NULL
BEGIN
INSERT INTO @MyTempTable
(
MyPK
)
SELECT MyPK
FROM MyNamesTable
WHERE Country = @Country -- Got an index on this one too
END
... etc
SELECT ... presentation columns
FROM @MyTempTable AS T
JOIN MyNamesTable AS N
ON N.MyPK = T.MyPK -- a PK join, V. efficient
JOIN ... other tables ...
ON ....
WHERE (@LastName IS NULL OR Lastname @LastName)
AND (@Country IS NULL OR Country @Country)
Обратите внимание, что все тесты повторяются [технически вам не нужен @Lastname один :)], включая непонятные, которые (допустим) не были в исходных фильтрах для создания @ MyTempTable.
Создание @MyTempTable разработано так, чтобы максимально использовать любые доступные параметры. Возможно, если доступны как @LastName, так и @Country, которые гораздо эффективнее заполняют таблицу, чем любой из них, поэтому мы создадим вариант для этого сценария.
Проблемы с масштабированием? Просмотрите фактические запросы и добавьте случаи для тех, которые можно улучшить.