#sql #sql-server
#sql #sql-сервер
Вопрос:
Я работаю в SQL Server. У меня есть три таблицы, TableA
, TableB
и TableMain
, с Date
, StartTime
и FinishTime
столбцы.
Мне нужно написать SQL — инструкцию , из которой нужно извлечь эти три значения столбца TableMain
. Если в the присутствует та же дата TableA
, то StartTime
значение должно исходить из нее, в противном случае просто используйте значение from TableMain
. Аналогично, если a FinishTime
присутствует в TableB
, то в конечном выводе это значение должно заменить значение в TableMain
.
Я хотел бы сделать это, объединив эти три таблицы. Ниже показаны данные в этих трех таблицах и конечный ожидаемый результат запроса.
Таблица:
Date StartTime
10/14/2016 11:00 AM
10/16/2016 10:00 AM
10/18/2016 11:30 AM
TableB:
Date FinishTime
10/15/2016 3:00 PM
10/16/2016 4:00 PM
10/17/2016 6:30 PM
10/18/2016 5:00 PM
TableMain:
Date StartTime FinishTime
10/14/2016 8:00 AM 10:00 PM
10/15/2016 8:00 AM 10:00 PM
10/16/2016 8:00 AM 10:00 PM
10/17/2016 8:00 AM 10:00 PM
10/18/2016 8:00 AM 10:00 PM
Желаемый результат:
10/14/2016 11:00 AM 10:00 PM
10/15/2016 8:00 AM 3:00 PM
10/16/2016 10:00 AM 4:00 PM
10/17/2016 8:00 AM 6:30 PM
10/18/2016 11:30 AM 5:00 PM
Комментарии:
1. Все, что вам нужно, это несколько левых соединений и результат производной таблицы. Смотрите мой ответ ниже.
2. Если есть кто-то, кто обновляет и редактирует вопросы в теге sql, лучше всего, это marc_s спасибо @marc_s
3. @JonH: о, большое спасибо, Джон!
Ответ №1:
COALESCE также будет работать здесь, без всех операторов CASE:
SELECT tablemain.date,
COALESCE(tablea.starttime, tablemain.starttime),
COALESCE (tableb.finishtime, tablemain.finishtime)
FROM tablemain
LEFT JOIN tablea
ON tablemain.date = tablea.date
LEFT JOIN tableb
ON tablemain.date = tableb.date
COALESCE принимает первое ненулевое значение в ряду. Итак, если в таблице a есть дата начала, она займет это. Если нет, то будет взята дата начала из таблицы main. Та же логика справедлива для даты завершения и таблицы b
Ответ №2:
Действительно непроверенный, но что-то вроде этого:
SELECT
t.DateVal,
t.Start,
t.Finish
FROM
(
SELECT
tm.DateVal AS DateVal,
CASE WHEN a.Start IS NOT NULL THEN a.Start ELSE tm.Start END AS Start,
CASE WHEN b.Finish IS NOT NULL THEN b.Finish ELSE tm.Finish END AS Finish
FROM
TableMain tm
LEFT JOIN
TableA a
ON
a.DateVal = tm.DateVal
LEFT JOIN
TableB b
ON
b.DateVal = tm.DateVal
) t
Ключевым моментом здесь является то, что вы используете некоторые левые соединения, оператор case и результат производной таблицы (в данном случае t
). Пожалуйста, обратите внимание на мои имена столбцов, просто измените имена ваших столбцов, и это должно сработать.