【问题标题】:Msg 8156, Level 16, State 1, Line 17 The column 'BID_Close' was specified multiple times for 't'消息 8156,级别 16,状态 1,第 17 行 为“t”多次指定了“BID_Close”列
【发布时间】:2019-11-29 13:20:09
【问题描述】:

我已经在 StackOverflow 链接上发现了一个问题:- SQL Server 2008 Specified column was specified multiple times 但对我帮助不大。

以下代码引发异常。我该如何解决这个问题?

--Calculating the average true range---------
WITH cteRange AS 
(
    SELECT 
        t.[Date],
        ROUND(t.[BID_High] - t.[BID_Low], 5) AS [H-L],
        ABS(ROUND(t.[BID_High] - t.[BID_Close], 5)) AS [H-Cp],
        ABS(ROUND(t.[BID_Low] - t.[BID_Close], 5)) AS [L-Cp]
    FROM 
        (SELECT 
             *, 
             [BID_Close]  = LAG([BID_Close]) OVER (ORDER BY [Date])
         FROM 
             [STOCK_DATA_FOR_ANALYSIS]) AS t 
), cteTrueRange AS 
(
    SELECT *
    FROM cteRange
    CROSS APPLY (
        SELECT MAX(v) AS v
        FROM (VALUES ([H-L]), ([H-Cp]), ([L-Cp])) AS value(v)
    ) AS sub([TR])
), cteTrueRange10 AS 
(
    SELECT
        *,
        LAG([TR], 1) OVER (ORDER BY [Date]) AS [TR1],
        LAG([TR], 2) OVER (ORDER BY [Date]) AS [TR2],
        LAG([TR], 3) OVER (ORDER BY [Date]) AS [TR3],
        LAG([TR], 4) OVER (ORDER BY [Date]) AS [TR4],
        LAG([TR], 5) OVER (ORDER BY [Date]) AS [TR5],
        LAG([TR], 6) OVER (ORDER BY [Date]) AS [TR6],
        LAG([TR], 7) OVER (ORDER BY [Date]) AS [TR7],
        LAG([TR], 8) OVER (ORDER BY [Date]) AS [TR8],
        LAG([TR], 9) OVER (ORDER BY [Date]) AS [TR9]
    FROM cteTrueRange
)
SELECT 
    [Date], [H-L], [H-Cp], [L-Cp], [TR], [TRA]
FROM 
    cteTrueRange10
CROSS APPLY 
    (SELECT CASE WHEN [TR9] IS NOT NULL THEN AVG(v) END AS v
        FROM (VALUES ([TR]), ([TR1]), ([TR2]), ([TR3]), ([TR4]), ([TR5]), ([TR6]), ([TR7]), ([TR8]), ([TR9])) AS value(v)
    ) AS sub([TRA]);

错误:

消息 8156,第 16 级,状态 1,第 17 行
为“t”多次指定了“BID_Close”列。

【问题讨论】:

  • 这里只定义哪一列属于哪个CTE-SELECT [Date], [HL], [H-Cp], [L-Cp], [TR], [TRA]....像 cteRange.[HL]...
  • @mkRabbani 抱歉,我听不懂你在说什么。我在 cteRange 中遇到了一个例外,我使用 t 作为别名
  • 你有 - “SELECT *, [BID_Close]....”。我猜它指定了两次。一个来自“SELECT *”,另一个是您定义的。出于测试目的,您可以尝试将 [BID_Close] 命名为 [BID_Close_test] 的不同名称。
  • @mkRabbani 所以你说我必须写 SELECT *, [BID_Close] AS [BID_CLOSE-TEST] = LAG([BID_Close]) OVER (ORDER BY [Date])
  • SELECT *, [BID_CLOSE-TEST] = LAG([BID_Close]) OVER (ORDER BY [Date])

标签: sql sql-server sql-server-2012


【解决方案1】:

问题出在这里:

(SELECT 
     *, 
     [BID_Close]  = LAG([BID_Close]) OVER (ORDER BY [Date])
 FROM 
     [STOCK_DATA_FOR_ANALYSIS]) AS t 

看起来STOCK_DATA_FOR_ANALYSIS 表/视图有一个名为BID_Close 的列,它由* 在您的SELECT 语句中选择。最重要的是,您还定义了一个别名为 BID_Close 的新列(由 LAG(...) 定义) - 所以现在您选择的数据集有 TWO 列称为 BID_Close,这导致错误。

您可以通过以下方式解决此问题:

  • 选择*,而只选择您真正需要的那些列(当然省略BID_Close 列):

    SELECT 
        (list of columns, except BID_Close),
        [BID_Close]  = LAG([BID_Close]) OVER (ORDER BY [Date])
    
  • 为该计算列定义不同的列别名 [BID_Close_Last] = LAG([BID_Close]) OVER (ORDER BY [Date]) 这样您的基础表中的列是BID_Close,而您新计算的值称为BID_Close_Last

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多