SQL Server Join中的条件OR - 多值参数

时间:2015-10-09 18:12:11

标签: sql-server-2008-r2 ssrs-2008-r2

我有一个包含4个参数的SSRS报告,其中两个参数是SQL Server 2008 R2中使用@material数据类型的多值参数(@colorVARCHAR(MAX))。我使用split函数以逗号分隔返回值:

SELECT * 
FROM MyView
WHERE height > 200
    AND width > 100
    AND (
        material IN (SELECT Item FROM [dbo].[MySplitFunction] (@material, ',')) OR
        color IN (SELECT Item FROM [dbo].[MySplitFunction] (@color, ','))
        )

(上面的代码将返回50条记录)

这种方法的问题在于这两个多值参数具有大约1,500种不同的颜色和材料,并且降低了性能。有时,返回结果需要40多分钟(视图中的行数大约为600,000)。

我尝试了一种不同的方法,我使用临时表并在JOIN而不是WHERE子句中使用它:

SELECT Item
INTO #TempTable
FROM [dbo].[MySplitFunction] (@material, ',')

SELECT  * 
FROM MyView 
INNER JOIN ON MyView.Item = #TempTable.Item
WHERE height > 200
    AND width > 100
    AND material IN (SELECT Item FROM [dbo].[MySplitFunction] (@material, ','))

(上面的代码只返回7条记录,但性能要好得多) 我的问题是如何通过添加另一个@color参数并允许OR条件,使用第二种方法返回相同数量的记录(50行)?因此,在SSRS报告中,用户可以多选这两个参数,查询将返回@material = values OR @color = Values。 只要加速查询并允许两个多值参数(@material,@ color)的OR条件,我对任何其他方法都持开放态度。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下内容可能会起作用。我不确定我的语法是否正确,它需要进一步的测试和分析,如果没有适当的结构和数据我就无法做到......

SELECT
 from MyVeiew
 where height > 200
  and width > 100
  and (exists (select Item
                from dbo.MySplitFunction(@material, ',')
                where Item = material)
       or exists (select Item
                   from dbo.MySplitFunction(@color, ',')
                   where Item = color)
      )

这将在嵌套函数调用上执行两个相关的子查询。在这些情况下,Exists检查通常比in查询更快。令我担心的语法位是"和(存在"位 - 这是OR子句的括号,并且与存在相结合它看起来有点不稳定。

我认为它应该做你想要的,但绝对需要进行测试。

我不信任or条款。要摆脱它,试试这个,看看会发生什么:

SELECT *  --  Better with specific columns
 from MyView
 where height > 200
  and width > 100
  and exists (select Item
                from dbo.MySplitFunction(@material, ',')
                where Item = material)
UNION select *
 from MyView
 where height > 200
  and width > 100
  and exists (select Item
                   from dbo.MySplitFunction(@color, ',')
                   where Item = color)

这会运行并组合两个查询,删除所有重复项 - 与OR子句几乎相同。

接下来要检查的是检查表大小和检查索引。您在(仅!)列高度,宽度,材质和颜色上过滤结果;如果表格很大,那么适当的索引会有所帮助。