检查多列是否具有表值参数中的多个值中的任意一个

hmtdttj4  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(231)

我正在尝试创建一个查询,以帮助从现有数据库中获取帐户列表。我将通过两个表值参数(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份报告。这意味着这可能每晚运行数百次。虽然它不是一个每小时运行数千次的系统,但它确实处理了大量数据。它将搜索的一些数据库将会很大,有很多账户需要搜索。

vkc1a9a2

vkc1a9a21#

一个选项使用 exists :

select a.acountId
from accounts a
where 
    exists (
        select 1 
        from #StatusCodes s 
        where s.id in (a.StatusId1, a.StatusId2, a.StatusId3, a.StatusId4)
    )
    or exists (
        select 1 
        from #IdentityCodes i 
        where i.id in (a.Identifier1, a.Identifier2, a.Identifier3, a.Identifier4)
    )

相关问题