根据与另一个表进行比较的条件向表中插入新行数据

时间:2021-01-25 19:07:32

标签: sql sql-server

我有一个跟踪器表,用于跟踪与我们的客户相关联的特定数字,称为“跟踪器”。该表如下所示:

customer_id    value     date_of_value
11111            2          2020-12-14
23332            6          2021-01-15

此表从另一个名为“值”的表中获取此信息,该表与上述表完全相同,但没有 date_of_value 列。 该表每天都在不断更新,与客户关联的价值会被新的价值覆盖。 我希望能够做的是创建一个小作业,以便“跟踪器”表查看“值”表以查看值是否已更新。如果是这样,我想在“跟踪器”表中插入一个新行,其中包含客户的 ID、新值和值更改的日期。 在我看来,查询看起来像这样:

CASE WHEN Tracker.value != Values.value
   THEN INSERT INTO Tracker (customer_id, value, date_of_value)
   VALUES (Values.id, values.value, GETDATE())

我尝试将它与 UPDATE 语句一起使用,但它们都不起作用。 理想情况下,“跟踪器”表将如下所示:

customerr_id    value      date_of_value
11111             2           2020-12-14
2332              6           2021-01-15
11111             3           2021-01-22
2332              8           2021-01-24 

如何设置此查询,以便在创建作业时插入带有更新信息的新行?当我尝试使用 UPDATE 方法时,它覆盖了“Tracker”表中的信息。

2 个答案:

答案 0 :(得分:2)

嗯。 . .您需要 np.seterr(all='raise') noise = np.random.normal(0,2,9*9).reshape(9,9) noise = np.around(noise,out=noise) noise = noise.astype(np.uint16,copy=True) signal = np.zeros((9,9), dtype=np.uint16) try: signal += noise except FloatingPointError: print("Overflow Detected") # Handle overflows print(test) 表中的最新值。然后将其与现有值进行比较并在存在差异的地方插入:

>>> np.int16(32000) * np.int16(3)
---------------------------------------------------------------------------
FloatingPointError                        Traceback (most recent call last)
<ipython-input-84-5e468485740e> in <module>
----> 1 np.int16(32000) * np.int16(3)

答案 1 :(得分:0)

我们可以在主表上创建一个触发器来向跟踪器表中插入一个新行:

CREATE TRIGGER trg_Tracking
ON MainTable
AFTER INSERT, UPDATE AS

IF (NOT UPDATE(value) OR NOT EXISTS
    (SELECT customer_id, value FROM inserted
    EXCEPT
    SELECT customer_id, value FROM deleted))
    RETURN;        -- early bail-out if we can

INSERT Tracker (customerr_id, value, date_of_value)
SELECT customer_id, value, GETDATE()
FROM (
    SELECT customer_id, value FROM inserted
    EXCEPT     --make sure to compare inserted and deleted values (AFTER INSERT has empty deleted values)
    SELECT customer_id, value FROM deleted
) changed;

GO     -- No BEGIN and END as the whole batch is the trigger