【问题标题】:Update statement on a cte with subquery使用子查询在 cte 上更新语句
【发布时间】:2019-02-08 13:40:09
【问题描述】:

我有一个 CTE,它基本上根据某些标准过滤数据,问题是过滤后我需要更新这些记录以“更正”它们,但我在 UPDATE 语句上得到一个 4104

当我直接调用变量时,我没有问题,但是在我进行计算的地方我得到一个错误,因为我从第一个和第二个查询中调用变量。

;WITH CTE AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY timestmp ASC) order,
    *
    FROM TSTSOLAP T
    (
        --SECOND QUERY
        SELECT 1 FROM TABLE1 T2 
        WHERE --CONDITIONS MET
            t.user_id = t2.id_user AND
            T.ID_TIP = T2.ID_TIP AND
            T.ID <> t2.ID AND 
            (T2.BEG BETWEEN T.BEG AND T.END)
            OR T2.BEG = T.END
    )

)
UPDATE CTE SET STAT=0, END = (T2.END - 1) --HERE IS WHERE I GET THE: Msg 4104, Level 16, State 1, Line 1
WHERE ORDER> 1
GO

如何调用非链接变量?

*代码因长度而缩短

【问题讨论】:

  • 您无法从外部访问子查询。 CONDITIONS MET 是什么?您需要加入表格以获取此信息。
  • 您需要在 CTE 结果中公开END 列,以便使用WHERE 子句中的值。因此,您需要使用联接或标量子查询而不是 EXISTS 并将 END 列添加到结果中。或者。将条件移至 CTE。
  • @Rango 条件是users_id匹配,type_id匹配,record_id不同,日期不同。
  • 更新语句无效。没有参考 CTE 公开的表 T2。唯一可以引用的列是表 1 中的列。
  • @Kurox:如果Table2 中的多行符合此条件怎么办?你想用什么T2.End 来更新Table1?逻辑根本不清楚。

标签: sql sql-server sql-update common-table-expression


【解决方案1】:

只做一个JOIN怎么样?

WITH toupdate AS (
      SELECT . . . ,
             ? as order
      FROM table1
     )
UPDATE T
    SET STAT = 0,
        END = (T2.END - 1)
    FROM T JOIN
         table2 T2 
         ON . . . <conditions here>
WHERE T.ORDER > 1;

根据您在子查询中的条件,您可能还需要EXISTS 子句。

【讨论】:

  • ORDER 来自 CTE,我假设来自 ROW_NUMBER()OVER(PARTITION By...
  • @Rango 。 . .根据提供的语法,子查询中没有ROW_NUMBER(),只有来自table1 的列。当然,如果确实需要,可以使用 CTE 来定义这样的列,但这绝对不是问题的一部分。
  • 他遗漏了一些相关的东西,阅读他的评论:FIRST QUERY, ORDER AND PARTITION AS ORDER
  • 订单列是用 row_number() 和 partition by 生成的,它在我的子查询之外设置了另一个标准,我认为我不能用 JOIN 做到这一点。我将放置整个第一个查询,请检查编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多