更快地对一个数据集进行多次检查的方法

时间:2013-07-10 00:23:37

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

有没有更好的方法来重写以下内容:

SELECT DISTINCT Column1, 'Testing #1' 
FROM MyTable
WHERE Column2 IS NOT NULL && Column3='Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #2'
FROM MyTable
WHERE Column3 IS NULL && Column2='Test Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #3'
FROM MyTable
Where ....

在大约35个联合所有语句中都查询同一个表。我想知道是否有更容易/更快的方法来做事。

2 个答案:

答案 0 :(得分:4)

是的,你可以用像这样的案例陈述重写它

SELECT Column1,
CASE WHEN Column2 IS NOT NULL AND Column3='Value' THEN 'Testing #1'
     WHEN Column3 IS NULL AND Column2='Test Value' THEN 'Testing #2'
     ELSE 'Testing #3' END as customcol
FROM MyTable

编辑:好的,我正在进行此编辑,因为根据您的评论,我们需要解决两个问题。 (我将保留原来的答案,以防它可能对某人有所帮助。)

1)应过滤结果集,不应有else部分。

这实际上可以通过此解决方案实现,因为else是可选的,并且数据可以在最后使用where子句进行过滤。

2)如果符合条件,则能够多次选择具有不同Testing #值的同一行。

然而,我之前的解决方案无法实现这一点。所以我想到了另一个。希望它适合你的情况。这是

S1 - 创建一个包含Testing #值(Testing #1Testing #2Testing #3等的新表格。假设此表名为Testing

S2 - 使用包含MyTable值的Testing表加入主表(Testing #)。因此,现在您可以获得实际数据和测试值的所有可能组合。

S3 - 使用where子句过滤您不希望出现的结果。

S4 - 过滤实际数据< - >测试组合并添加where子句。

结束查询应如下所示:

SELECT M.Column1, T.TestingValue
FROM MyTable M
INNER JOIN Testing T ON 1=1
WHERE 
(
    (M.Column2 IS NOT NULL AND M.Column3='Value' AND T.TestingValue='Testing #1') OR
    (M.Column3 IS NULL AND M.Column2='Test Value' AND T.TestingValue='Testing #2') OR
    <conditions for other testing values>
)
AND
<other conditions>

我认为这应该有效并产生你想要的结果。但由于我没有数据,因此无法运行基于联合的解决方案的任何基准测试。所以我没有任何科学证据表明这种方法更快,但它是一种选择。你可以测试两者并使用更好的一个。

可能有点晚了,但希望这能解决你的问题。

答案 1 :(得分:0)

您可以在一个语句中执行此操作,但是您希望每个测试都有不同的列:

select column1,
       (case when column2 is not null and column3 = 'Value' then 1 else 0
        end) as Test1
       (case when column3 is null and column3 = 'Test Value' then 1 else 0
        end) as Test2,
       . . .
from t;

因为你只想要事情失败的情况,你可以把它放在子查询中并测试任何失败:

select *
from (select column1,
             (case when column2 is not null and column3 = 'Value' then 1 else 0
              end) as Test1
             (case when column3 is null and column3 = 'Test Value' then 1 else 0
              end) as Test2,
             . . .
      from t
     ) t
where test1 + test2 + . . . > 0