2016-12-06 5 views
0

を選択します。ここでは、部分サンプルです:SQL - 私はバージョンフィールドと速度テーブルを持っているの好適なバージョン

 id milepost speed version 

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

は基本的に、私は「優先バージョン」でクエリを実行したい:指定した速度バージョンで行(mileposts)をフェッチしようとすると、特定のmilepostがで見つからない場合そのバージョンは、デフォルトでバージョン1になります。 私の好みの速度のバージョンが2だったのであれば、例えば、私の結果は、行2及び3からの速度が含まれます

milepost speed 

      0  30 
      5  50 

をしかし、どのように私はそれを行うには、単一のSELECTを構築することができますか? ありがとう、おはようございます。

EDIT:あなたの答えの 両方が解決策を見つけるために私にインスピレーションを与えてきました。以下は、完全なクエリではありませんが、アイデアを与える:

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

関連する問題