2016-12-06 4 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, чтобы сделать это? Спасибо, и у вас хороший стек за день.

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

Какая СУБД вы используете? –

+1

Пожалуйста, отметьте свой вопрос в базе данных, которую вы используете. –

+0

Я не уверен, что вы имеете в виду. Если вы говорите, какой тип SQL я использую, я использую инструмент dbaccess для Informix SQL. –

ответ

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

Есть ли эквивалент функции COALESCE в Informix Sql? –

+0

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

Смежные вопросы