2015-03-26 2 views
2

Есть три таблицы с данными, как показано ниже:Условный присоединяется в одном запросе

ТОРГОВ:

enter image description here

GRD_TIME_ZONE:

enter image description here

PRI_TIME_ZONE:

enter image description here

Мне нужно получить значение time_zone. Для этого у меня есть два варианта:

Вариант 1:

SELECT trade_id, t.grd_exch_cd, time_zone_name 
FROM trades t 
JOIN grd_time_zone gtz ON t.grd_exch_cd = gtz.grd_exch_cd; 

enter image description here

Вариант 2:

SELECT t.trade_id, t.grd_exch_cd, time_zone_name 
FROM trades t 
JOIN pri_time_zone ptz ON t.trade_id = ptz.trade_id; 

enter image description here

Если вы заметили, я не получаю time_zone для всех трех сделок.

Мое требование объединить оба вышеуказанных запросов в один запрос, используя следующую логику:

  • Если grd_exch_cd в таблице торгов сопоставлен один и только один TIME_ZONE в grd_time_zone таблице, а затем получить значение оттуда.

  • Если таблица grd_exch_cd в таблице сделок NULL, получите значение time_zone из таблицы pri_time_zone.

  • Если таблица grd_exch_cd в таблице торгов сопоставляется более чем 1 time_zone в таблице grd_time_zone, тогда получите значение time_zone из таблицы pri_time_zone.

SELECT trade_id, t.grd_exch_cd, time_zone_name 
FROM trades t 
-- if grd_exch_cd is mapped to one time_zone in grd_time_zone 
JOIN grd_time_zone gtz ON t.grd_exch_cd = gtz.grd_exch_cd 
-- else if grd_exch_cd is NULL or mapped to more than one time_zone in grd_time_zone 
JOIN pri_time_zone ptz ON t.trade_id = ptz.trade_id; 

Может кто-то пожалуйста, помогите в разработке такого запроса, который выполняет условное соединение.

ответ

0

Вот запрос, который сначала присоединяется к сделкам и таблице pri_time_zone, а затем объединяет результат с другим запросом, который принимает все временные зоны, которые точно совпадают. Просто идея:

SELECT T.TRADEID , 
     T.GRD_EXCH_CD , 
     PTZ.TIME_ZONE_NAME 
FROM TRADES T 
     INNER JOIN PRI_TIME_ZONE PTZ 
     ON T.TRADEID = PTZ.TRADEID 
UNION 
SELECT T.TRADEID, 
     GTZ.GRD_EXCH_CD, 
     GTZ.TIME_ZONE_NAME 
FROM TRADES T 
     JOIN GRD_TIME_ZONE GTZ 
      ON T.GRD_EXCH_CD = GTZ.GRD_EXCH_CD 
WHERE T.TRADEID in 
         (SELECT T.TRADEID 
         FROM  TRADES T 
            JOIN GRD_TIME_ZONE GTZ 
            ON T.GRD_EXCH_CD = GTZ.GRD_EXCH_CD 
         GROUP BY T.TRADEID 
         HAVING COUNT(*) =1) 
1

Моя склонность будет использовать внешние соединения в совокупности запросов для достижения этой цели:

SELECT t.trade_id, 
     t.grd_exch_cd, 
     CASE Count(DISTINCT gtz.time_zone_name) 
     WHEN 1 THEN Max(gtz.time_zone_name) 
     ELSE Max(ptz.time_zone_name) 
     END 
FROM trades t 
     left join grd_time_zone gtz 
       ON t.grd_exch_cd = gtz.grd_exch_cd 
     left join pri_time_zone ptz 
       ON t.trade_id = ptz.trade_id 
GROUP BY t.trade_id, 
      t.grd_exch_cd 
  • Мы используем MAX консолидировать множество значений. Если есть более одного gtz.time_zone_name, тогда мы не будем использовать это значение в любом случае, поэтому не имеет значения, какой из них мы выбираем.
  • gtz.time_zone_name будет возвращать ноль, если нет соответствующей записи grd_time_zone, поэтому нет необходимости явно проверять на наличие null.
  • left join (aka внешнее соединение) как вы говорите «дайте мне все от trades, но только соответствующие записи от grd_time_zone» в SQL.
Смежные вопросы