【发布时间】:2015-11-02 12:31:56
【问题描述】:
我正在尝试从 Select 创建一个更新,在特定情况下 (88) 应该使用以前的值来更新列字段
UPDATE myTable
SET MyDateCol = CASE MYSelect.Indicator
WHEN 88 THEN @previosValue
ELSE MYSelect.NewValue
FROM myTable
INNER JOIN ( ... ) AS MYSelect
ON myTable.ID = MYSelect.ID
示例:
MYSelect | myTable
|
Indicator NewValue | MyDateCol
0 1 | 1
1 2 | 2
88 3 | 2 <-
3 4 | 4
4 5 | 5
5 6 | 6
6 7 | 7
88 8 | 7 <-
全面更新
UPDATE [dbo].[BestellDetails]
SET [Datum] = CASE MYTABLE.WochenTag WHEN 88 THEN lag(MyDate) over(order by MYTABLE.MyDate) ELSE MyDate END
FROM [BestellDetails]
INNER JOIN
(
SELECT INNERTabelle.BestellDetailId,INNERTabelle.WochenTag, DATEADD (dd,INNERTabelle.WochenTag, INNERTabelle.NewDatum) AS MyDate
FROM
(
SELECT TOP 100 PERCENT BestellDetailId,
dbo.FirstDateOfWeekISO8601(dbo.Bestellung.Jahr,
dbo.Bestellung.Kalenderwoche) AS NewDatum,
(CASE BestellDetails.RefMenuId WHEN Speiseplandetails.RefMoId THEN 0
WHEN Speiseplandetails.RefDiId THEN 1
WHEN Speiseplandetails.RefMiId THEN 2
WHEN Speiseplandetails.RefDoId THEN 3
WHEN Speiseplandetails.RefFrId THEN 4
WHEN Speiseplandetails.RefSaId THEN 5
WHEN Speiseplandetails.RefSoId THEN 6 ELSE 88 END) AS WochenTag
FROM dbo.Speiseplandetails
RIGHT OUTER JOIN dbo.BestellDetails ON dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefMoId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefDiId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefMiId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefDoId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefFrId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefSaId
OR dbo.BestellDetails.RefMenuId = dbo.Speiseplandetails.RefSoId
RIGHT OUTER JOIN dbo.Bestellung ON dbo.BestellDetails.RefBestellId = dbo.Bestellung.BestellId
order by BestellDetailId
) as INNERTabelle
) AS MYTABLE
ON [BestellDetails].BestellDetailId = MYTABLE.BestellDetailId
【问题讨论】:
-
如果是sql server或者oracle,可以看
lag()函数。 -
定义“以前的”。是否基于对
NewValue列中的值进行排序? -
@Damien_The_Unbeliever 是的,确实
-
我们可以连续两行都有
88指示符吗? -
@Damien_The_Unbeliever 为什么我们需要 2 个指标行是不够的?并确保您可以根据需要再创建 1 行
标签: sql sql-server select sql-update case