【问题标题】:SQL: How can I declare a variable inside a derived table?SQL:如何在派生表中声明变量?
【发布时间】:2012-02-07 21:21:25
【问题描述】:

我正在尝试创建一个逗号分隔的列表,并且我正在使用派生表。但是我不能在LEFT OUTER JOIN 中声明变量...我该怎么做?

    LEFT OUTER JOIN (

               DECLARE @String AS VARCHAR(MAX) = NULL
               SELECT @String = COALESCE(@String + ', ','') + Name
                 FROM MyTable
               SELECT @String, Col1
                 FROM MyTable
                GROUP BY Col1

    ) AS T8
   ON This = That

它在Declare 关键字上显示错误语法。

谢谢!

【问题讨论】:

    标签: sql-server-2008 left-join declare derived-table


    【解决方案1】:

    您不能在派生表中声明变量。

    但是您可以在语句之外声明它并以与示例中相同的方式使用它

    【讨论】:

    • 我试过了,它强调了“+名称”,给出了错误:在预期条件的上下文中指定的非布尔类型的表达式。
    • 哪个表有“名称”列?
    • 不,一定没有问题:SELECT @String = COALESCE(@String + ', ','') + Name FROM MyTable 必须把"名称”栏。尝试仅执行此语句(当然要声明字符串)。
    • 当执行DECLARE @String AS VARHCAR(MAX) = NULL SELECT @String = COALESCE(@String+', ','') + Name FROM MyTable时,它执行得很好……
    • 太棒了!下一步是将您的计算字符串添加到派生表中: LEFT OUTER JOIN ( SELECT @String, Col1 FROM MyTable GROUP BY Col1 ) AS T8
    【解决方案2】:

    您的要求没有意义,因为该变量不能真正在表变量中使用。如果你想在表变量之后使用它,它仍然没有意义......你是否期望变量的多个实例,对于 Col1 的每个不同值一次?也许你的意思是:

    LEFT OUTER JOIN
    (
      SELECT Col1, String = STUFF((
         SELECT ',' + Name
            FROM dbo.MyTable AS i 
            WHERE i.Col1 = o.Col1 
            FOR XML PATH(''), 
            TYPE).value(N'./text()[1]', N'nvarchar(max)'),1,1,'')
      FROM dbo.MyTable AS o
      GROUP BY Col1
    ) AS T8
    ON This = That
    

    但是,T8 有点让我害怕。此联接中已涉及多少表?

    【讨论】:

    • 我不会在 8 点的时候撒谎... 最好先看看然后从那里出发?
    • 没有足够的信息来回答这个问题。也许如果您将整个查询作为一个单独的问题发布,包括表结构、一些示例数据和所需的结果,并寻求帮助以使其更加优化。除了与 DW 相关的星型连接之外,8 表连接对我来说似乎有点高。
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2012-03-13
    相关资源
    最近更新 更多