2016-12-06 67 views
0

我有一个版本字段的速度表。下面是部分示例:SQL - 选择首选版本

 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

您正在使用哪个DBMS? –

+1

请用你正在使用的数据库标记你的问题。 –

+0

我不确定你的意思。如果您正在讨论我正在使用的SQL类型,我正在使用Informix SQL的dbaccess工具。 –

回答

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); 
+0

我会马上试试。 –

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> 

正如你可以看到这让你有多个“默认值”,所以它是比较一般。

+0

Informix Sql中是否有等价的COALESCE函数? –

+0

NVL() - http://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqlt.doc/ids_sqt_151.htm – Hogan