我遇到的情况是我试图找到一个版本中有效的属性。我有一个Version表和Property表。属性记录具有引入和删除的版本。
我正在尝试选择介绍和删除之间的属性。删除的是null但是这会混淆我的联接。我用下面的SQL补偿了(以丑陋的方式)。如果删除的in为null,则将其设置为int的最大值。这样可行但是当Removed In为null时忽略连接中的第二个限定条件会很好。有什么想法吗?
**Version**
id Name
--- -----------------
1 VersionA
2 VersionB
**Property**
id Name IntroducedInVersion RemovedInVersion
--- ----------------- ------------------- -----------------
1 Property1 1 null
2 Property2 1 2
SELECT
p.PropertyName
,p.IntroducedInVersion
,p.RemovedInVersion
FROM
Version v
join Property p on p.IntroducedInVersion <= v.Id
and ISNULL(cp.RemovedInVersion, 2147483647) > v.Id
WHERE
v.Id = 1
答案 0 :(得分:1)
你可以这样做:
SELECT
p.PropertyName
,p.IntroducedInVersion
,p.RemovedInVersion
FROM Version v
join Property p
on (RemovedInVersionp is null
and v.id > IntroducedInVersion)
or
v.id between IntroducedInVersion
and RemovedInVersion - 1
WHERE v.Id = 1
但我认为它的效果不如原始查询。
更好的选择是:
SELECT
p.PropertyName
,p.IntroducedInVersion
,p.RemovedInVersion
FROM Version v
join Property p
on v.id between IntroducedInVersion
and ifnull(RemovedInVersion - 1, v.id)
WHERE v.Id = 1
这是有效的,因为一个值等于它自己,所以它将“介于”本身和另一个值之间。