2016-12-06 93 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