根据标志,通过SQL从不同的表中选择

时间:2008-10-30 04:12:55

标签: sql sql-server sql-server-2005 tsql

我有一个脚本可以从更大的表中提取某些数据,特别是一个字段会定期更改,例如

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,这使得事情很难处理?)或者另一种解决方案,那仍然相当快速?

编辑:这是否是一个很好的理由,我试图实现的想法是没有三个基本相同的查询,只有表格不同 - 无论何时对表格进行更改,都必须进行相同的编辑。逻辑。这就是为什么到目前为止我已经避免了“让国旗完全分开”的原因......

4 个答案:

答案 0 :(得分:5)

我认为您需要将@Flag完全从查询中拉出来,并使用它来决定运行三个单独的SELECT语句中的哪一个。

答案 1 :(得分:3)

每个FLAG值的UNION ALL怎么样。

在第一位的where子句中包括:

AND @flag = 1

虽然关于为不同的标志值运行不同的select语句的注释对我来说也是有意义的。

答案 2 :(得分:0)

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

答案 3 :(得分: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

然后根据最后一个字段做出决策。更简单,可能应该首先发生在我身上。