1

我需要帮助来优化我的一个函数中的 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 语句检查哪些参数表有记录的情况下执行此操作 - 它会使函数变得更大且难以阅读。

欢迎提出想法和建议。

4

1 回答 1

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

好处:

  1. JOIN 的结果更快,因为它没有处理所有数据(它已经被过滤了)
  2. 调整起来看起来更简单
于 2013-01-28T15:07:18.667 回答