在SQL Server 2008 R2数据库中,给定此架构:
AgentsAccounts
_______________
AgentID int UNIQUE
AccountID
FinalAgents
___________
AgentID
我需要创建一个执行此操作的查询:对于FinalAgents中的每个AgentID“final”,从AgentsAccounts中删除与“final”具有相同AccountID的所有OTHER AgentID。因此,如果表在查询之前有这些行:
AgentsAccounts
AgentID AccountID
1 A
2 A
3 B
4 B
FinalAgents
1
3
然后在查询之后,AgentsAccounts表将如下所示:
AgentsAccounts
AgentID AccountID
1 A
3 B
什么T-SQL查询会在不使用curosr的情况下删除正确的行?
答案 0 :(得分:2)
Aaron的帖子不太正确,因为当没有最终座席时,它会删除表格中的所有内容。问题非常清楚地表明只应删除具有相同帐户的内容。如果将值“(5,'C')”添加到代理帐户记录中,则可以看到此信息。
以下仅删除最终业务代表表中提到的账户:
delete aa
from @AgentsAccounts aa join
(select fa.AgentID, aa.AccountID
from @FinalAgents fa join
@AgentsAccounts aa
on fa.agentId = aa.agentId
) fa
on fa.AccountID = aa.AccountID and
fa.AgentID <> aa.agentID;
我使用与Aaron的答案相同的命名约定来澄清差异。看看会发生什么:
INSERT @AgentsAccounts VALUES (1,'A'), (2,'A'), (3,'B'), (4,'B'), (5, 'C');