我正在尝试创建一个查询,以帮助从现有数据库中获取帐户列表。我将通过两个表值参数(tvp)从c#传入两个整数列表。然后,我需要查看多个列在相应的tvp表中是否有任何值。整数的tvp列表由不同的客户端提供,并且在客户端之间可能不同。这就是为什么它们是tvp,允许值作为参数传入。
数据结构无法更改,它是基于另一个系统的数据创建的。有关更改数据结构的注解将没有帮助。为了提供帮助,我将讨论一个示例表,它将帮助显示我需要什么。
查看如下表格:
Table Accounts
varchar(200) AccountId
int StatusId1
int StatusId2
int StatusId3
int StatusId4
int Identifier1
int Identifier2
int Identifier3
int Identifier4
int Identifier5
我知道我可以执行如下sql语句: Select AccountId from Accounts where StatusId1 In (1,2,3)
我也学会了逆转指挥权: Select AccountId from Accounts where 1 In (StatusId1, StatusId2, StatusId3, StatusId4)
这只允许我对每列检查一个值。问题是我需要在使用tvp作为整数列表时混合这两者。
我能创建的最接近的是:
--Load the TVP lists
SELECT * INTO #StatusCodes FROM @StatusId
SELECT * INTO #IdentityCodes FROM @IdentifierId
--Find the Accounts that have the chosen Ids
SELECT AccountId
FROM Accounts
WHERE StatusId1 IN( SELECT Id FROM #StatusCodes)
OR StatusId2 IN( SELECT Id FROM #StatusCodes)
OR StatusId3 IN( SELECT Id FROM #StatusCodes)
OR StatusId4 IN( SELECT Id FROM #StatusCodes)
OR Identifier1 IN (SELECT Id FROM #IdentityCodes)
OR Identifier2 IN (SELECT Id FROM #IdentityCodes)
OR Identifier3 IN (SELECT Id FROM #IdentityCodes)
OR Identifier4 IN (SELECT Id FROM #IdentityCodes)
OR Identifier5 IN (SELECT Id FROM #IdentityCodes)
这个查询在我的原型中起作用,我得到了至少有一个ID的帐户列表。我看到很多精选的语句,看起来不太好。我也不确定它的表现如何。我想知道有没有更好的办法?
这是一个系统,它根据客户的条件创建报告。每个客户每晚都会有几到100份报告。这意味着这可能每晚运行数百次。虽然它不是一个每小时运行数千次的系统,但它确实处理了大量数据。它将搜索的一些数据库将会很大,有很多账户需要搜索。
1条答案
按热度按时间vkc1a9a21#
一个选项使用
exists
: