我应该抵制减少重复的冲动……但是伙计,这对我来说真的不合适。
这种“感觉”会更好吗?
SELECT ...很多列和复杂的东西...
从
(
选择我的PK
来自 TBooks
在哪里
(--...一些条件)
AND @AuthorType = 1 AND --...不同的条件)
联合所有
选择我的PK
来自 TBooks
在哪里
(--...一些条件)
AND @AuthorType = 2 AND --...不同的条件)
联合所有
...
) 作为 B1
加入 TBooks 作为 B2
在 B2.MyPK = B1.MyPK
JOIN ...其他表...
伪表 B1 只是获取 PK 的 WHERE 子句。然后将其连接回原始表(以及所需的任何其他表)以获得“演示文稿”。这样可以避免在每个 UNION ALL 中重复 Presentation 列
您可以更进一步,先将 PK 插入到临时表中,然后将其连接到其他表以用于表示方面。
我们对非常大的表执行此操作,用户在查询内容上有很多选择。
声明 @MyTempTable 表
(
MyPK int 非空,
首要的关键
(
我的PK
)
)
如果@LastName 不为空
开始
插入@MyTempTable
(
我的PK
)
选择我的PK
FROM MyNamesTable
WHERE LastName = @LastName -- 假设我们有一个有效的索引
结尾
别的
如果@Country 不为空
开始
插入@MyTempTable
(
我的PK
)
选择我的PK
FROM MyNamesTable
WHERE Country = @Country -- 也有关于这个的索引
结尾
... ETC
SELECT ... 展示栏
来自@MyTempTable AS T
JOIN MyNamesTable AS N
ON N.MyPK = T.MyPK -- 一个 PK 连接,V. 高效
JOIN ...其他表...
在 ....
WHERE(@LastName 为 NULL 或姓氏 @LastName)
AND(@Country 为空或国家/地区@Country)
请注意,所有测试都是重复的 [从技术上讲,您不需要 @Lastname 一个 :)],包括(可以说)不在原始过滤器中创建 @MyTempTable 的模糊测试。
@MyTempTable 的创建旨在充分利用可用的任何参数。也许如果@LastName 和@Country 都可用,那么填充表格的效率要比它们中的任何一个都高得多,所以我们为这种情况创建了一个案例。
缩放问题?查看正在进行的实际查询,并为可以改进的查询添加案例。