我需要帮助来优化我的一个函数中的 SQL 逻辑。请注意,我无法使用存储过程。
这是我的桌子。它将使用包含大量记录的@MainTable 进行初始化。
DECLARE TABLE @ResultTable
(
ResultValue INT
)
这些是存储一些参数的表——它们也可以是空的。
DECLARE TABLE @ParameterOne (ParameterOne INT)
DECLARE TABLE @ParameterTwo (ParameterOne NVARCHAR(100))
...
DECLARE TABLE @ParameterN(ParameterN TINYINT)
现在,我需要将很多表加入到我的@MainTable 中,以便从中仅选择其中的一些记录。所选记录取决于存储在参数表中的信息。
所以,我目前的解决方案是:
INSERT INTO ResultTable(ResultValue)
SELECT ResultValue
FROM MainTable M
INNER JOIN @MainOne MO
ON M.ID=MO.ID
....
INNER JOIN @MainN MN
ON M.IDN=MN.ID
WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=MO.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))
AND
...
AND
(EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterN=MN.Name) OR NOT EXISTS (SELECT 1 FROM @ParameterN ))
因此,我们的想法是仅当记录与参数表中的当前条件匹配时才添加记录。
因为我无法使用过程来构建动态查询,所以我正在使用 WHERE 子句以及每个参数表的 EXISTS 和 NOT EXISTS 组合。
问题是当我添加越来越多的参数表时它的工作速度会变慢。是否有其他方法可以在不使用大量 IF/ELSE 语句检查哪些参数表有记录的情况下执行此操作 - 它会使函数变得更大且难以阅读。
欢迎提出想法和建议。