【问题标题】:Run two select statements in one view?在一个视图中运行两个选择语句?
【发布时间】:2018-05-17 21:24:54
【问题描述】:

我有一些 SQL 被分成两个 SELECT 语句。第一个 SELECT 语句将结果插入到临时表中。第二个 SELECT 语句是一个 COALESCE,它从第一个插入数据的临时表中读取数据。我需要能够一起运行这些(一个接一个),但不幸的是,由于我公司使用的旧报告工具,我无法将它们放入存储过程中。报告工具必须从 VIEW 或 TABLE 中读取。我想把这些放到一个 VIEW 中,但研究过一个视图不能有多个 SELECT。关于如何做到这一点的任何想法和例子?我的原始帖子/显示 SQL 的解决方案位于 this post

【问题讨论】:

  • 您可以将这些查询分解为 CTE(不使用临时表)并在一个视图中执行。
  • 可能值得在这里编辑,因为您的第二个选择使用临时表多次。 (这绝对应该引导事情走向 CTE 而远离子查询)

标签: sql sql-server tsql


【解决方案1】:

临时表选择可以转换为 CTE(With 子句),第二部分是视图的选择查询。

或者,您可以使用子选择内联它,但取决于可能使其更难维护的复杂性。

CREATE VIEW yourView AS
WITH myFirstSelect(someFields) AS
(
    SELECT somefields FROM sometable
)
SELECT * from myFirstSelect

文档:https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-2017

【讨论】:

  • 当我的第一个 SELECT 如下所示时,如何格式化 WITH:SELECT c.ClientID, c.LastName, c.FirstName, c.MiddleName, ccs.Description AS 'PCHP/HCH Status', --以前是客户端状态 CASE WHEN cudf.UserDefinedFieldFormatULink = '93fb3820-38aa-4655-8aad-a8dce8aede65' THEN cudf.UDF_ReportValue END AS 'DA Status', p.Description AS ProgramDescription, cp.StartDate, cp.EndDate INTO #TempTest
  • 删除最后的 INTO #TestTest,并将 select 放在 WITH 子句中。该语句中没有 From 子句,所以我假设它是一个片段
  • 知道了!工作!非常感谢!
  • 安德鲁 - 我刚刚注意到一个问题。使用我原来的两个 SELECT 语句(使用 COALESCE),我为每个客户端返回一条记录,其中包含所有状态字段(即我使用 COALESCE 的原因),而不是它们显示尽可能多的记录 - 每个状态一个。无论如何,使用 CTE,我得到了重复的记录!它的行为与原始查询不同。想法?在 COALESCE 上使用 SELECT DISTINCT 似乎可以修复它,但结果计数仍然不同。
  • 您转置查询的方式一定有所不同,将插入到临时的 CTE 移动不会改变重复处理本身。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
相关资源
最近更新 更多