【问题标题】:UPDATE and SELECT after CTE - SQL ServerCTE 之后的 UPDATE 和 SELECT - SQL Server
【发布时间】:2016-01-14 18:30:44
【问题描述】:

我正在尝试创建一个包含 CTE 的视图。我的总体目标是从 CTE 中选择最大日期,但如果该日期为 NULL,则将其转换为 DATETIME,最后通过将日期与 CTE 进行比较来选择大于最大日期的日期。

我知道这听起来令人困惑,但下面是我的查询(希望它更清晰):

;WITH cte (MaxDate) AS (
                    SELECT MAX(date) AS MaxDate
                        FROM ServerA.tableNameA
                    )

UPDATE cte
SET MaxDate = CONVERT(DATETIME, 0)
WHERE MaxDate IS NULL 

SELECT top 1000 c1, c2,..etc
    FROM ServerB.tableNameA
    WHERE date > (SELECT MaxDate    
                        FROM cte)

我认为在线阅读我不允许在 CTE 之后进行 UPDATE 和 SELECT,那么我该怎么做呢?

【问题讨论】:

  • 您可以从 CTE 更新。但是这里不更新表字段,你改变Max()的值,cte之后不能更新和选择,只有一个
  • 您也不能在视图内更新。
  • @StuartAinsworth 是的,你可以更新一个 cte 并反映在桌子上stackoverflow.com/questions/11562536/…
  • 如果 Max(Date) 为空,那么所有字段都没有日期,那么您的查询到底会返回什么?
  • @JamieD77 ServerA.tableNameA ServerB.tableNameA

标签: sql-server common-table-expression


【解决方案1】:

只需改进您的 cte 以返回正确的值,您就不需要更新

;WITH cte (MaxDate) AS (
     SELECT CASE 
                 WHEN MAX(date) IS NULL THEN CONVERT(DATETIME, 0)
                 ELSE MAX(date)
            END AS MaxDate
     FROM ServerA.tableNameA
)
SELECT top 1000 c1, c2,..etc
FROM ServerB.tableNameA
WHERE date > (SELECT MaxDate    
              FROM cte)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 2018-10-06
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多