【问题标题】:Multiple SELECTs from one nested SELECT来自一个嵌套 SELECT 的多个 SELECT
【发布时间】:2021-12-23 19:08:59
【问题描述】:

我在一个查询中运行多个 SELECT,它们使用相同的嵌套 FROM SELECT。 代码是这样的:

SELECT B FROM (SELECT A) DATA; 
SELECT C FROM (SELECT A) DATA;
SELECT D FROM (SELECT A) DATA;
SELECT E FROM (SELECT A) DATA

有没有办法“存储” SELECT A(变量?其他方式?)并在这个查询中使用它,还是我需要每次都重复它? SELECT A 非常大,我想让这个查询尽可能干净。

【问题讨论】:

  • 创建VIEW?
  • 就是这样!我知道这是一个 facepalm 问题,但据我所知,这是我所知道的。非常感谢!

标签: sql sql-server nested


【解决方案1】:

第一个解决方案 以文本形式执行查询

declare @QuerySub_Str  Nvarchar(500);
set @QuerySub_Str ='SELECT A'
declare @QueryFinal_Str Nvarchar(4000);
set @QueryFinal_Str = 'SELECT B FROM (' + @QuerySub_Str +') DATA; 
SELECT C FROM (' + @QuerySub_Str +') DATA;
SELECT D FROM (' + @QuerySub_Str +') DATA;
SELECT E FROM (' + @QuerySub_Str +' DATA;'
EXEC sp_executesql @sql

最佳解决方案 创建包含部分查询的视图 在最终查询中使用它

Create VIEW [dbo].[View_1]
AS
SELECT  1 as A , 2 As B  , 3 As C , 4 As D  , 5 As E  
FROM            Table_1
GO

SELECT B FROM View_1 ; 
SELECT C FROM View_1 ;
SELECT D FROM View_1 ;
SELECT E FROM View_1 ;

【讨论】:

    【解决方案2】:

    您可以创建VIEW,这样您只需要编写一次A查询,但是如果您只想执行一次查询中的数据,您也可以将数据保存在一个变量中。您可以阅读here 的区别。下面的例子。

    DECLARE @A TABLE (
        B NVARCHAR(250) NOT NULL
    ,   C INT NOT NULL
    ,   D NVARCHAR(250) NULL
    )
    
    INSERT INTO @A (B, C, D)
    SELECT 
        [ColumnB]
    ,   [ColumnC]
    ,   [ColumnD]
    FROM [dbo].[MyTable] 
    
    SELECT [B] FROM @A; 
    SELECT [C] FROM @A; 
    SELECT [D] FROM @A; 
    

    【讨论】:

      【解决方案3】:

      哦,有多种选择,具体取决于您的用例:

      1. 如果嵌套的 SELECT 永远不会改变,你可以create a view

      2. 如果所有语句都在同一个会话中执行,并且过滤大多在嵌套SQL中完成,则可以将其结果选择到a temp table or a temp variable

      3. 如果这些 SQL 语句是在代码中创建的,您可以创建一个 common table expression (CTE)。是的,您仍然需要在每个 SQL 中包含 CTE,但您只需将其附加在每个 SELECT 语句的开头而不是中间,这可能让您的代码更具可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-31
        • 2011-11-25
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多