【问题标题】:Select from different tables via SQL depending on flag根据标志通过 SQL 从不同的表中选择
【发布时间】:2008-10-30 04:12:54
【问题描述】:

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

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,这会让事情变得难以处理?)或者替代解决方案,这仍然相当快?

编辑:无论这是否是一个很好的理由,我试图实现的想法是不要有三个基本相同的查询,它们仅在表上有所不同 - 然后每当对逻辑。这就是为什么到目前为止我一直避免“让标志完全分开”的事情......

【问题讨论】:

  • 您在尝试将其整合到一个查询中所花费的精力最好花在完成工作上。

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


【解决方案1】:

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

【讨论】:

  • 如果您的查询就像您在此处显示的那样简单......这确实是最好的答案。
【解决方案2】:

对于每个 FLAG 值使用 UNION ALL 怎么样?

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

AND @flag = 1

虽然关于为不同的标志值运行不同的选择语句的评论对我来说也很有意义。

【讨论】:

  • 用 UNION ALL 以这种方式解决它意味着重复大部分 SQL 查询,这是 Margaret 所说的她试图避免的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    一个更简单的解决方案,一个同事建议的:

    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
    

    然后根据最后一个字段做出决策。简单得多,我可能一开始就应该想到。

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多