также включить записи в этой таблице, которые соответствуют условию в другой таблице в SQL - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблицы в этих строках:

A:

id   param_1   param_2    status     dateUpdated
-----------------------------------------------
1    valuea   valueb    Active      2018-10-02
2    valuec   valued    Inactive    2018-09-03
3    valuee   valuef    Active      2018-10-01
4    valueg   valueh    Active      2017-01-20
5    value1   value2    Active      2018-03-03
6    value3   value4    Active      2016-10-21
...

B:

id    a_id   some_param    dateModified
-------------------------------------
1     3      x             2018-10-04 
2     2      y             2018-06-30
3     4      aa            2018-10-01
...
99    6      ab            2018-01-16
100   3      z             2018-04-08

Я хочу записи в A, которые были обновлены послеопределенная дата, но также включает в себя другие записи (если они еще не существуют, в противном случае возвращаются самые последние даты), которые соответствуют условию даты из другой таблицы B.

если только таблица A:

select id,
       param_1, 
       param_2, 
       dateUpdated
from A
where status = 'Active'
and dateUpdated between @someDate and @someAnotherDate

Теперь с объединением:

select distinct  A.id,
                 A.param_1, 
                 A.param_2, 
                 A.dateUpdated -- or B.dateModified, whichever is latest if that's even possible
from A
join B on B.a_id = A.id
where A.status = 'Active'
and ((A.dateUpdated between @someDate and @someAnotherDate) || (B.dateModified between @someDate and @someAnotherDate))

Итак, из вышесказанного, скажем, для someDate = '2018-10-01' и someAnotherDate = '2018-10-04' Я бы получил результат:

id,  param_1   param_2    dateUpdated
------------------------------------
1    valuea   valueb      2018-10-02
3    valuee   valuef      2018-10-04
4    valueg   valueh      2018-10-01

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

С B требуется максимальная дата в данном диапазоне на a_id.Внешне соедините этот результат с A и используйте CASE WHEN, чтобы получить более новую дату.

select
  a.id,
  a.param_1,
  a.param_2,
  a.status,
  case when bmax.max_date > a.dateUpdated then bmax.max_date else a.dateUpdated as updated
from a
left join
(
  select a_id, max(dateModified) as max_date
  from b
  where dateModified between @someDate and @someAnotherDate
  group by a_id
) bmax on bmax.a_id = a.id
where a.status = 'Active'
and 
(
   a.dateUpdated between @someDate and @someAnotherDate
   or
   bmax.dateModified between @someDate and @someAnotherDate
)
order by a.id;
0 голосов
/ 04 октября 2018

используйте левое соединение и регистр для получения последней даты

select distinct  A.id,
                 A.param_1, 
                 A.param_2, 
                 case when A.dateUpdated > B.dateUpdated
                 then A.dateUpdated else B.dateUpdated end

from A
left join B on B.a_id = A.id
where A.status = 'Active'
and ((A.dateUpdated between @someDate and @someAnotherDate) 
    OR (B.dateModified between @someDate and @someAnotherDate))
...