根据 table 中的价值存在采取不同的行动
Take different actions depending on value presence in table
我有 table 我在其他 tables:
中添加特定列值的更改
更新日志表:
TableName
ColumnFilter
FilterName
FilterValue
Difference
Date
Fruits
FruitName
Apple
4
0
1/13/2021
Fruits
FruitName
Pear
5
0
1/13/2021
当我根据 tables 的最后更新日期插入新记录时,我无法确定插入条件。
例如,昨天我的库存 Apples
等于 4
,今天是 5
。因此,在我的 UpdatesLog table 中,我将插入 Fruits-FruitName-Apple-5
。在 Difference
列中,我将计算昨天和今天的值之间的差异,即 1
。这没问题,因为我已经将 Apple 作为 FilterName 列中的值。
但是如果我在 Fruits table
的最后一次更新中添加了新的 FruitName - Peach
,我应该如何检查该值不存在并使用默认值添加它 Difference value equal to 0
?
以下是 1 月 14 日的最后更新:
Fruits
FruitsInventory
LastUpdateDate
Apple
5
1/14/2021
Pear
9
1/14/2021
Peach
10
1/14/2021
这是我期待的结果:
TableName
ColumnFilter
FilterName
FilterValue
Diff
Date
Fruits
FruitName
Apple
4
0
1/13/2021
Fruits
FruitName
Pear
5
0
1/13/2021
Fruits
FruitName
Apple
5
1
1/14/2021
Fruits
FruitName
Pear
9
4
1/14/2021
Fruits
FruitName
Peach
10
0
1/14/2021
这是我的代码,以防我不检查水果名称是否存在:
INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT [TableName]
, [ColumnFilter]
, [FilterName]
, [FilterValue]
, [Difference]
, LUP as [Date]
FROM (
SELECT tr.TableName
, tr.ColumnFilter
, tr.FilterName
, tr.FilterValue
, tr.[FilterValue] - ult.[FilterAbsValue] AS [Difference]
, LUP
FROM (SELECT
'Fruits' as [TableName]
, 'FruitName' as [ColumnFilter]
, FruitName as [FilterName]
, FruitsInventory AS [FilterValue]
, MAX(LastUpdateDate as date) as LUP
FROM Fruits
WHERE 1=1
) tr
RIGHT JOIN UpdatesLogTable ult
ON tr.TableName = ult.TableName and tr.ColumnFilter = ult.ColumnFilter
WHERE hus.LastUpdateDate = (SELECT MAX(CAST(LastUpdateDate as date)) FROM UpdatesLogTable)
) a
我正在考虑 LEFT 或 RIGHT 连接,但这只有在我知道水果品种是增加还是减少时才有效。
你问题中的代码比较混乱。例如:
#HistoryUpdatesSuccess
未定义。
- 您有一个使用
FRUITS
的格式错误的聚合子查询。
JOIN
条件缺少过滤值。
不过,我想我明白你想做什么 -- 插入新行,其中的 DIFF
列合并了现有数据中的最新数据。
这看起来像是 LEFT JOIN
历史上最近的记录 table。剩下的就是 COALESCE()
.
INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT f.TableName, f.ColumnFilter, f.FilterName, f.FilterValue,
COALESCE(f.FilterValue - ult.FilterValue, 0),
LUP as [Date]
FROM FRUITS F LEFT JOIN
(SELECT ult.*,
ROW_NUMBER() OVER (PARTITION BY TableName, ColumnFilter ORDER BY LastUpdateDate) as seqnum
FROM UpdatesLogTable ult
) ult
ON tr.TableName = ult.TableName AND
tr.ColumnFilter = ult.ColumnFilter AND
tr.FilterName = ult.FilterName
seqnum = 1;
我有 table 我在其他 tables:
中添加特定列值的更改更新日志表:
TableName | ColumnFilter | FilterName | FilterValue | Difference | Date |
---|---|---|---|---|---|
Fruits | FruitName | Apple | 4 | 0 | 1/13/2021 |
Fruits | FruitName | Pear | 5 | 0 | 1/13/2021 |
当我根据 tables 的最后更新日期插入新记录时,我无法确定插入条件。
例如,昨天我的库存 Apples
等于 4
,今天是 5
。因此,在我的 UpdatesLog table 中,我将插入 Fruits-FruitName-Apple-5
。在 Difference
列中,我将计算昨天和今天的值之间的差异,即 1
。这没问题,因为我已经将 Apple 作为 FilterName 列中的值。
但是如果我在 Fruits table
的最后一次更新中添加了新的 FruitName - Peach
,我应该如何检查该值不存在并使用默认值添加它 Difference value equal to 0
?
以下是 1 月 14 日的最后更新:
Fruits | FruitsInventory | LastUpdateDate |
---|---|---|
Apple | 5 | 1/14/2021 |
Pear | 9 | 1/14/2021 |
Peach | 10 | 1/14/2021 |
这是我期待的结果:
TableName | ColumnFilter | FilterName | FilterValue | Diff | Date |
---|---|---|---|---|---|
Fruits | FruitName | Apple | 4 | 0 | 1/13/2021 |
Fruits | FruitName | Pear | 5 | 0 | 1/13/2021 |
Fruits | FruitName | Apple | 5 | 1 | 1/14/2021 |
Fruits | FruitName | Pear | 9 | 4 | 1/14/2021 |
Fruits | FruitName | Peach | 10 | 0 | 1/14/2021 |
这是我的代码,以防我不检查水果名称是否存在:
INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT [TableName]
, [ColumnFilter]
, [FilterName]
, [FilterValue]
, [Difference]
, LUP as [Date]
FROM (
SELECT tr.TableName
, tr.ColumnFilter
, tr.FilterName
, tr.FilterValue
, tr.[FilterValue] - ult.[FilterAbsValue] AS [Difference]
, LUP
FROM (SELECT
'Fruits' as [TableName]
, 'FruitName' as [ColumnFilter]
, FruitName as [FilterName]
, FruitsInventory AS [FilterValue]
, MAX(LastUpdateDate as date) as LUP
FROM Fruits
WHERE 1=1
) tr
RIGHT JOIN UpdatesLogTable ult
ON tr.TableName = ult.TableName and tr.ColumnFilter = ult.ColumnFilter
WHERE hus.LastUpdateDate = (SELECT MAX(CAST(LastUpdateDate as date)) FROM UpdatesLogTable)
) a
我正在考虑 LEFT 或 RIGHT 连接,但这只有在我知道水果品种是增加还是减少时才有效。
你问题中的代码比较混乱。例如:
#HistoryUpdatesSuccess
未定义。- 您有一个使用
FRUITS
的格式错误的聚合子查询。 JOIN
条件缺少过滤值。
不过,我想我明白你想做什么 -- 插入新行,其中的 DIFF
列合并了现有数据中的最新数据。
这看起来像是 LEFT JOIN
历史上最近的记录 table。剩下的就是 COALESCE()
.
INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT f.TableName, f.ColumnFilter, f.FilterName, f.FilterValue,
COALESCE(f.FilterValue - ult.FilterValue, 0),
LUP as [Date]
FROM FRUITS F LEFT JOIN
(SELECT ult.*,
ROW_NUMBER() OVER (PARTITION BY TableName, ColumnFilter ORDER BY LastUpdateDate) as seqnum
FROM UpdatesLogTable ult
) ult
ON tr.TableName = ult.TableName AND
tr.ColumnFilter = ult.ColumnFilter AND
tr.FilterName = ult.FilterName
seqnum = 1;