我在SQL Server中编写一个没有关系的更新时遇到了麻烦。我遍布整个论坛,但我很难找到答案。
如果客户,金额匹配,我需要更新OCR。问题是这不是一个独特的关键。因此,如果客户有多个记录,金额组合,我需要在查找表中取最旧的匹配并从中更新OCR。然后我需要取第二个最旧的并用其OCR更新第二行。
我试图在下表中看到它。
欢迎所有建议!
要更新的表格 - 更新前
Customer OCR Amount
740000010417 220.000
740000010417 220.000
740000010421 300.000
740000010421 250.000
查找表
Customer OCR Amount Date ID
740000010417 222357110626 220.000 2011-11-11 15:48:48.510 100642
740000010417 222350553822 220.000 2011-10-18 10:10:26.210 18680
740000010417 222350464525 220.000 2011-10-18 10:10:26.210 18681
740000010417 222357110725 220.000 2011-11-11 15:48:48.510 102547
740000010421 222357127726 250.000 2011-11-11 15:48:48.510 102548
740000010421 222357127725 220.000 2011-10-19 10:10:26.210 102549
740000010421 222357130555 250.000 2011-10-19 10:10:26.210 102550
更新后的表格
Customer OCR Amount
740000010417 222350553822 220.000
740000010417 222350464525 220.000
740000010421 300.000
740000010421 222357130555 250.000
答案 0 :(得分:1)
update table set ocr =
(select l.ocr
from
(select l.customer as customer, l.ocr as ocr, l.amount as amount, l.date as date, ROW_NUMBER() OVER (partition by l.customer, l.amount Order BY l.date) as RowNum
from lookuptable l
order by l.date
)a
(select t.customer as customer, t.amount as amount, ROW_NUMBER() OVER (PARTITION BY t.customer, t.amount order by t.customer) as RowNum
from table t
)b
where a.customer = b.customer and a.amount=b.amount and a. rowNum = b.RowNum
)
我没有测试过它,但它可能会给你一个想法。
编辑: 刚认识到没有必要加入内部查询。 想法是首先从查找表中选择所有记录,并按日期的升序为它们分配行号。 因此,相同的客户和具有不同日期的相同金额将以递增顺序获得行号。
然后从旧表中获取记录,并为客户和金额分配行号。通过这种方式,我们可以匹配客户,金额和行号sunch,首先相同的客户和金额将初始化最早的OCR,因为行按日期排序
答案 1 :(得分:0)
这就是我最终的结果,就像一个魅力!谢谢Zohaib!
UPDATE t1
SET t1.ocr = l1.ocr
FROM ( SELECT *
, rnk = ROW_NUMBER() OVER ( PARTITION BY t.customer,
t.Amount ORDER BY t.customer, t.Amount )
FROM table t) t1
LEFT JOIN
( SELECT *
, rnk = ROW_NUMBER() OVER ( PARTITION BY l.customer,
l.Amount ORDER BY l.date, l.id)
FROM lookuptable l) l1
ON t1.id = l1.id
AND t1.Amount = l1.amount
AND t1.rnk = l1.rnk