2008-10-30 85 views
0

我有一个脚本可以从更大的表格中提取某些数据,特别是一个字段会定期变化,例如,根据标志通过SQL从不同的表格中选择

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
     THEN t.field3 END as field, 
     ...[A bunch of other fields] 
FROM table t 

但是,问题是现在我想对数据做其他处理。我试图找出最有效的方法。我需要通过某种方式让旗帜通过,所以我知道我在谈论正确的领域切分的数据。

我玩了一下(主要是看看会发生什么)的一个可能的解决方案是将脚本的内容转储到一个表函数中,该函数将标志传递给它,然后使用SELECT查询函数的结果。我已经设法使它工作,但它显着慢于...

显而易见的解决方案,可能是处理器周期的最有效的使用:创建一系列缓存表,三个标志值。然而,问题是找到某种方法从正确的缓存表中提取数据来执行计算。最明显的,虽然不正确,反应会是这样

SELECT CASE @Flag WHEN 1 THEN table1.field WHEN 2 THEN table2.field WHEN 3 
     THEN table3.field END as field, 
     ...[The various calculated fields] 
FROM table1, table2, table3 

不幸的是,很明显,这创造了一个巨大的交叉连接 - 这不是我想要的结果的。

有谁知道如何将该交叉连接变成“只看x表”? (没有使用动态SQL,这使得事情很难处理?)或者一个替代解决方案,这仍然是相当迅速?

编辑:无论这是一个很好的理由,我试图实现的想法是没有三个大部分相同的查询,只有不同的表 - 这将不得不被编辑相同,每当改变逻辑。这就是为什么我避免了“有标志完全分离”的事情到目前为止......

+0

您花费在尝试将其作为一个查询的努力将花在完成工作上。 – 2008-10-30 16:08:56

回答

0

一个简单的解决方案,以及一个由同事建议:

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
    THEN t.field3 END as field, 
    [A bunch of other fields], 
    @Flag as flag 
FROM table t 

然后做基础上的最后一个领域的决定。简单得多,而且可能本来应该发生在我身上。

5

我认为你需要将@Flag从查询中拉出来,然后用它来决定将三个单独的SELECT语句中的哪一个跑。

+0

如果您的查询非常简单,就像您在那里展示的一样......这真的是最好的答案。 – 2008-10-30 10:32:48

0

您似乎将注意力集中在技术上而不是要解决的问题上。想一想每种情况下主表中的一个选择 - 这就是你在这里描述的方式,不是吗?

3

对于FLAG的每个值,UNION ALL如何?

在第一位的where子句包括:

AND @flag = 1 

虽然有关运行不同的标记值不同的SELECT语句的评论也对我来说很有意义。

+0

用UNION ALL解决这个问题意味着重复大部分的SQL查询,这正是玛格丽特所说的她试图避免的。 – 2008-10-30 17:24:43

相关问题