SQL - 选择首选版本

时间:2016-12-06 16:47:42

标签: sql select row version

我有一个带有版本字段的速度表。以下是部分样本:

     id    milepost  speed version

     1           0     40       1
     2           0     30       2
     3           5     50       1

基本上,我想用"首选版本进行查询" :尝试使用指定的速度版本获取行(里程碑),如果找不到该版本的某个里程碑,则默认采用版本1。 因此,例如,如果我的首选速度版本是2,我的结果将包含第2行和第3行的速度:

   milepost  speed

          0     30
          5     50

但是我怎样才能构建一个SELECT来做到这一点? 谢谢你,并且在一天中有一个很好的堆栈。

编辑: 你的两个答案都激励我找到解决方案。以下不是完整的查询,但它提出了一个想法:

select s1.milepost_from milepost, s1.value speed from speeds s1
where s1.version = 2 or (s1.version = 1 and not exists
(select 1 from speeds s2 where s2.milepost_from = s1.milepost_from and s2.version = 2))

关键是要做一个与主要选择的永久信息(示例中的milepost_from)匹配的子选择。 谢谢!

2 个答案:

答案 0 :(得分:0)

一种方法使用union all

select t.*
from t
where version = @preferred_version
union all
select t.*
from t
where version = 1 and
      not exists (select 1 from t t2 where t2.version = @preferred_version and t2.id = t.id);

答案 1 :(得分:0)

您可以使用左连接和合并

SELECT IDLIST.ID AS ID, COALESCE(T1.SPEED, T2.SPEED, <final default value>) AS SPEED
FROM (SELECT DISTINCT ID FROM TABLE) AS IDLIST
LEFT JOIN TABLE T1 ON IDLIST.ID = T1.ID AND T2.VERSION = <ver you look for>
LEFT JOIN TABLE T2 ON IDLIST.ID = T2.ID AND T2.VERSION = <default marker>

正如您所看到的,这可以让您拥有多个“默认值”,因此它更为通用。