我有一个服务,每次使用该服务时都会导入excel文件。一个excel文件将被添加到"账户"表中,另一个文件将添加到"交易"表中。我必须对这两个文件进行检查,以尝试将"Account"中的"Name"与"Transaction"中的"TransactionName"匹配(精确匹配、soundex、差异等(。当它们匹配时,交易文件会更新,以包括匹配的账户详细信息(这就是为什么我在交易表的下面将它们放在单独的括号中(
每次匹配时,名称和ID都会添加到一个名为"Trained"的表中,以便下次上传其他文件时,如果这些文件中存在其他文件,并且在Trained表中显示它们匹配,则事务表会自动更新。"AccountName"可能会在Trained表中出现多次,因为可能有几个交易名称与其匹配,所以在Traineed表中主键是唯一的,因为它们必须是唯一的。
这3张表分别是:
Account(AccountNumber(PK), Name, Address)
Transaction(ID(PK), TransactionName, Address, (AccountNumber, Name, Address)))
Trained (TrainedID, ID, TransactionName(PK), Address, AccountNumber(PK), Name, Address, Status,
Trained)
当一个新文件被上传并进行精确匹配和插入训练时,我不想重复项目,我会出错。我如何更新此查询以同时包含"如果TransactionName和AccountNumber已在Trained中成对出现,则不再添加"?
insert into trained select Transaction.ID, Transaction.TransactionName, Transaction.Address,
account.AccountNumber, Status = 'Matched', Trained='Exact'
from Transaction
left join account on account.AccountName = Transactions.ResellerName
where Transactions.ResellerName = account.AccountName
order by accountNumber
例如。我上传了一个账户文件和一个交易文件,我的表格如下:
交易-Account,Transactiona dn Trained表示例
下次上载新的事务文件时,如果它的TransactionName再次为"123Solutions",然后再次尝试用其匹配项更新Trained表。但是gtraied表已经包含了它与AccountNumber80的匹配项。我得到一个Primary_Key错误。
谢谢你的帮助!
insert into trained
select
Transaction.ID,
Transaction.TransactionName,
Transaction.Address,
account.AccountNumber,
Status = 'Matched',
Trained='Exact'
from Transaction
left join account on account.AccountName = Transactions.ResellerName
where Transactions.ResellerName = account.AccountName
and not exists(select * from traind where id = Trasnaction.id and accountNumber = account.accountNumber)
order by accountNumber
首先,我建议将左联接替换为内部联接,因为您使用where子句来精确筛选联接匹配的记录。此外,您可以将左联接添加到经过训练的表中,然后筛选尚未包含在此表中的所有记录。查询可能看起来像这样:
insert into trained
select t.ID, t.TransactionName, t.Address,
a.AccountNumber, Status = 'Matched', Trained='Exact'
from [Transaction] t
inner join [account] a on a.AccountName = t.ResellerName
left join [trained] tr on tr.TransactionName = t.TransactionName and tr.AccountNumber = a.AccountNumber
where tr.TransactionName is null
order by accountNumber