我有一个脚本可以从更大的表中提取某些数据,特别是一个字段会定期更改,例如
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 :(得分: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
然后根据最后一个字段做出决策。更简单,可能应该首先发生在我身上。