【问题标题】:SQL Computed Column from Temp Table临时表中的 SQL 计算列
【发布时间】:2016-06-09 18:48:35
【问题描述】:

我正在尝试使用对表的自引用在 SQL Server Management Studio 中添加计算列。

我的专栏如下:

[Employee ID]   [Previous State Date]    [Previous State] 
                [Next State Date]        [Next State]

我想添加一个显示第三个状态的列(发生在 [Next State] 列之后)。例如,如果有人从状态 a -> b -> c 出发,就会有两行:

[Employee 1][1/1/2016][a][1/2/2016][b]
[Employee 1][1/2/2016][b][1/3/2016][c]

我希望只显示数据:

[Employee 1][1/1/2016][a][1/2/2016][b][c]

为此,我创建了两个列,[PreviousID][NextID],它们连接状态、日期和员工 ID。

我想使用临时表引入temp.[Next State] WHERE table.[Next State] = temp.[Previous State] 的新列

当我尝试这个时,我得到了错误:

在这种情况下不允许子查询。只允许使用标量表达式。

我的代码:

SELECT * INTO #temp FROM table

ALTER TABLE table 
ADD [Next Next State] AS (SELECT [Next State] 
                          FROM temp  
                          WHERE table.[Next State] = temp.[Previous State])

【问题讨论】:

  • 你能用你正在使用的 sql server 标记你的问题吗?另外,听起来您需要一个单独的状态表来管理这些状态。
  • 已标记。我正在使用 SQL Server Management Studio 2012
  • 你的基表有主键吗?
  • 我猜你是 [Next State] 列是某种 varchar。检查这个simple-talk.com/sql/t-sql-programming/… 虽然我仍然认为检查你的表结构是更好的方法。如果您有一个只有 [EmployeeID][Date][State] 的表格,那么您将记录新的状态,它会更有效。
  • 我以上述格式从外部源中提取数据。当我创建另一个仅包含状态的表时,尝试在计算列中引用子查询时,我仍然会遇到相同的错误

标签: sql tsql join sql-server-2012 temp-tables


【解决方案1】:

忘记临时表并使用带有聚合函数和 CTE 的 GROUP BY 查询。比如:

WITH EarliestLastChanges(EmployeeID, EarliestStateChange, LatestStateChange)
AS
(SELECT
    [Employee ID] AS EmployeeID,
    MIN([Previous State Date]) AS EarliestStateChange
    MAX([Next State Date]) AS LatestStateChange
FROM
    table
GROUP BY
    [Employee ID])
SELECT
    ELC1.EmployeeID,
    Concatenated field for Earliest from T1,
    Concatenated field for Latest from T2
FROM
   EarliestLastChanges AS ELC1
   JOIN
   table as T1
   ON ELC1.EmployeeID = T1.[Employee ID] AND ELC1.EarliestStateChange = T1.[Previous State Date]
   EarliestLastChanges AS ELC2
   JOIN
   table as T2
   ON ELC2.EmployeeID = T2.[Employee ID] AND ELC2.EarliestStateChange = T2.[Next State Date]

我同意上述 cmets 的观点,即重新设计会是更好的选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2017-09-23
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多