检查表中是否存在范围内的所有值,SQL Server

时间:2017-11-20 17:29:26

标签: sql sql-server

我有两张表格,它们以下面提到的方式相关。

  • 表1包含三列ProductIdVersionInVersionOut
  • 表2包含列ProductIdVersion

我需要根据以下标准过滤掉表1中的记录。

如果表2包含VersionIn(包括)和VersionOut(不包括)[VersionIn, VersionOut)之间的所有版本,则选择记录,否则需要丢弃该记录。丢弃的东西在这里很有意思。

例如:表1

ProductId   VersionIn    VersionOut
-----------------------------------
   100          1            3
   100          3            6

表2

ProductId   Version
-------------------
   100         1
   100         2
   100         3
   100         4
   101         1

在这种情况下,Table1的记录1是有效的,因为表1中存在版本1,2,但表1中的记录2无效(并且感兴趣),因为表中缺少5(因为,VersionIn = 3, VersionOut = 6表示[3,6]或[3,5])

我试过了:

select 
    T1.ProductId, T1.VersionIdIn, T1.VersionIdOut, T2.VersionId 
from 
    Table1 as T1 
inner join 
    Table2 as T2 on T1.ProductId = T2.ProductId 
                 and T2.VersionId between T1.VersionIdIn and T2.VersionIdOut  

以及我检查所有连续的是否存在的方式是使用以下查询:

select 
    T1.ProductId, T1.VersionIdIn, T1.VersionIdOut, count(VersionId) 
from
    Table1 as T1 
inner join 
    Table2 as T2 on T1.ProductId = T2.ProductId 
                 and T2.VersionId between T1.VersionIdIn and T1.VersionIdOut - 1 
group by 
    ProductId, VersionIdIn, VersionIdOut 

如果count小于 VersionOut-VersionIn ,则表2中缺少值。

我想知道这种方法是否正确和傻瓜式证明,并且更好的方法是可行的。我是SQL的新手并且可以欣赏它的强大功能,但有时在编程条件方面受到限制,我发现它很多编程语言更容易

1 个答案:

答案 0 :(得分:0)

如果Table2中的记录包含ProductID和Version的重复值,则您的解决方案将不正确。您可以确保这两个字段上有唯一索引,或者您的查询可以使用Count(Distinct VersionID)而不是Count(VersionID)。否则,我无法想到这会出错的方式。