【问题标题】:Iterative union SQL query迭代联合 SQL 查询
【发布时间】:2019-05-08 14:05:29
【问题描述】:

我正在与 CA (Broadcom) UIM 合作。我想要从多个视图中提取不同值的最有效方法。对于 S_QOS_DATA 表中存在的每个 QOS,我都有以“V_”开头的视图。我特别想为以“V_QOS_XENDESKTOP”开头的任何视图提取数据。

给我快速结果的低效方法如下:

  1. select * from s_qos_data where qos like 'QOS_XENDESKTOP%';
  2. 获取该数据并将其放入 Excel。
  3. 使用CONCAT 仅将 qos 名称转换为查询,例如:

    SELECT DISTINCT samplevalue, 'QOS_XENDESKTOP_SITE_CONTROLLER_STATE' AS qos FROM V_QOS_XENDESKTOP_SITE_CONTROLLER_STATE union

  4. 向下复制所有行的公式单元格,并从最后一个查询中删除 Union 添加分号。

这行得通,我得到了输出,但必须有一个更优雅的解决方案。我发现的大多数与通过 SQL 进行迭代相关的答案都使用数字,或者似乎不是我想要的。示例:Multiple select queries using while loop in a single table? Is it Possible? 和 Syntax of for-loop in SQL Server

【问题讨论】:

  • 您应该为所有 QOS 创建一个视图,并带有一列。每个 QOS 有一个单独的行并不是一个好主意 - 正如您所发现的那样。
  • 是否可以将这些V_(some QOS from S_QOS_DATA) 合并到一个视图中,这样您就不必合并视图了?或者...是这个系统的架构,每个V_(some QOS from S_QOS_DATA) 本身都构建在单个表之上,用于保存该 QOS 的数据(完全不熟悉这个 CA 博通 UIM 数据模型)。如果每个 QOS 都有自己的表并且这些 V_ 视图有助于对齐列,那么 UNION 可能是您最好的选择,但它很难看。
  • @JNevill 是的,每个 V_ 都是 RN_、HN_ 和 DN 表的连接,其中包含原始、每小时和每日数据以及 S_QOS_DATA 表。例如,RN_10567 可以是包含 QOS_XENDESKTOP_SITE_CONTROLLER_STATE qos 的所有原始数据的表。
  • 我想我同意@GordonLinoff 的建议。也许您可以分享其中一些 V_ 视图,我们可以建议一种方法将它们组合成一个 V_QOS_XENDESKTOP 视图,其中包含所有 XENDESKTOP QOS 数据,而无需使用 UNION。
  • 我在考虑 SELECT * FROM sys.views ;然后在你放 where [name] like '%your_condition_here%' 的地方;但这只是您解决方案的一部分。第 2 步)动态查询为您构建所有选择 *。然后你就开火了。

标签: sql sql-server


【解决方案1】:

执行您想做的最有效的方法是执行 CA 脚本(您链接到的脚本)所做的事情。也就是说,使用动态 SQL:从系统表中创建一个包含所需 SQL 的字符串,然后执行它。

更有效的方法是根据基础表编写不同的查询,模仿您关心的视图中的条件。

不过,除非您的视图定义经常更改,否则我建议不要使用动态 SQL。 (我怀疑它们经常更改。您重新生成视图的频率不会比获得新脚本的频率高,对吧?CA 不会随意添加表格。)AFAICT,这基本上就是您已经在做的事情。

为自己获取一个视图名称列表,并明确地针对它们的联合编写查询。已完成的工作:易于理解,无需太多修改工作,并且您为服务器提供了优化的最佳机会。

我可以想象,如果不能将所有这些工作放到您自己的视图中,并在您方便的时候对其进行查询,这是令人沮丧和容易出错的。大多数组织不允许用户编写自己的视图和程序(由他们自己的帐户拥有,而不是 dbo),这太糟糕了。我能提供的最好的方法是将视图主体保存到文件中,并将其插入到查询中的WITH 子句中

WITH (... query ...) as V select ... from V

【讨论】:

  • 谢谢。每当我执行任何任务时,我都会尝试寻找一种编写脚本的方法,因此如果我需要再次执行此操作,我只需更改一个参数,它就会为不同的输入输出类似的结果。我不知道这是否会再次需要,但如果是的话,我想找到最干净、最有效的方法来处理它。您对 CA 脚本提出了一个很好的观点,当我创建我的版本时,我什至没有构建替换特殊字符的逻辑,因为我知道 xendesktop 的名称中没有任何名称。我认为你是对的,如果我真的想编写脚本,我应该看看他们有什么。
猜你喜欢
  • 2013-06-07
  • 2017-11-02
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多