我有两张表格,它们以下面提到的方式相关。
ProductId
,VersionIn
和VersionOut
ProductId
和Version
我需要根据以下标准过滤掉表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的新手并且可以欣赏它的强大功能,但有时在编程条件方面受到限制,我发现它很多编程语言更容易
答案 0 :(得分:0)
如果Table2中的记录包含ProductID和Version的重复值,则您的解决方案将不正确。您可以确保这两个字段上有唯一索引,或者您的查询可以使用Count(Distinct VersionID)而不是Count(VersionID)。否则,我无法想到这会出错的方式。