我有一个带有版本字段的速度表。以下是部分样本:
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)匹配的子选择。 谢谢!
答案 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>
正如您所看到的,这可以让您拥有多个“默认值”,因此它更为通用。