我需要帮助来优化我的一个函数中的SQL逻辑。请注意,我无法使用商店程序。
这是我的桌子。它将使用包含大量记录的@MainTable进行初始化。
DECLARE TABLE @ResultTable
(
ResultValue INT
)
这些是存储一些参数的表 - 它们也可以是emty。
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语句检查哪些参数表有记录的情况下执行此操作 - 这将使函数更大且难以读取。
欢迎提出意见和建议。
答案 0 :(得分:1)
好问题。
尝试以下方法:
INSERT INTO ResultTable(ResultValue)
SELECT ResultValue
FROM MainTable M
INNER JOIN (SELECT * FROM @MainOne WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=@MainOne.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))) MO
ON M.ID=MO.ID
....
INNER JOIN (SELECT * FROM @MainN WHERE (EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterOne=@MainN.Name OR NOT EXISTS (SELECT 1 FROM @ParameterN))) MO
ON M.IDN=MN.ID
优点: