SQL使用2 WHERE子句和成对的值插入SELECT



我有一个服务,每次使用该服务时都会导入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

相关内容

  • 没有找到相关文章

最新更新