2014-08-13 3 views
1

таблице 1:Выборка Дата на основе другой даты

Temp ResID  Code  Date 
11  1   SPR  
12  1   SPG  2009-10-05 
13  1   SPR 
14  1   SPG  2011-10-08 

Таблица 2:

TempID Res ID  InDate  Out Date 
21   1.   2009-10-05 2010-11-15 
22   1.   2011-10-08 2011-11-09 

Таблица 3: (желаемый результат)

ResID  Code  Date 
1   SPR  2010-11-15 
1   SPG  2009-10-05 
1   SPR  2011-11-09 
1   SPG  2011-10-08 

У меня есть две таблицы, как указано выше.

Мне нужно обновить столбец «Таблица 1» для каждого идентификатора для каждой строки, где код SPR. Значение SPG в столбце даты таблицы 1 равно значению столбца InDate для одного и того же резидента

Проконсультируйтесь с запросом. Как я могу добиться этого с помощью запроса, соединяющего две таблицы, таблица 1 и таблица 2, чтобы получить таблицу 3

+0

Доступны ли только эти столбцы? Имеется ли в таблице 1 столбец идентификатора INT? –

+0

Нет, это единственные столбцы no Identity column – user3614477

+1

Как вы можете различать первую и третью строку int table1? – Andomar

ответ

1

редактироваться из отборного заявления на обновление

Я думаю, что это будет работать для вас. См SqlFiddle

Update 
    Table1 
set 
    Table1.[Date] = Table2.OutDate 
from 
    Table1 
    inner join 
    (
    select 
     Temp, 
     ResID, 
     Code, 
     Date, 
     row_number() over(partition by ResID order by Temp) as RowId 
    from 
     Table1 
    where 
     Code = 'SPR' 
) as SPR on Table1.Temp = SPR.Temp 
    inner join 
    (
    select 
     ResID, 
     Code, 
     Date, 
     row_number() over(partition by ResID order by Temp) as RowId 
    from 
     Table1 
    where 
     Code = 'SPG' 
    ) as SPG on SPG.RowId = SPR.RowId and SPG.ResID = SPR.ResID 
    inner join 
    Table2 on Table2.InDate = SPG.Date and Table2.ResID = SPG.ResID 
+0

Хороший ответ , но как бы вы «обновляете» строки в таблице1? – Andomar

+0

Спасибо, я думаю, я был смущен, думая, что таблица 3 была отдельной таблицей и не обновляла существующую таблицу. Я переработаю ответ, чтобы включить обновление. Я думаю, что ваш ответ проще, но может быть полезен, если они не могут удалить ... –

+0

@Andomar это должно работать так же хорошо! –

1

Вы можете удалить все SPR строки, а затем генерировать их:

delete Table1 
where code = 'SPR'; 

insert Table1 
     (ResID, Code, [Date]) 
select t1.ResID 
,  'SPR' 
,  OutDate 
from Table1 t1 
join Table2 t2 
on  t1.ResID = t2.ResID 
     and t1.[Date] = t2.InDate 
where t1.Code = 'SPG'; 

Example at SQL Fiddle.

0

Если table2 имеет значение для каждой таблицы один, то вы можете просто использовать таблица2, вид странно, но вы всегда можете присоединиться к основной таблице, чтобы получить соответствующий результат, если хотите, чтобы вы делали

select Convert(varchar, indate, 102) as date, 'SPG' as code, resid from table2 
union all 
select convert(varchar, outdate, 102) as date, 'SPR' as code, resid from table2 

SQL Fiddle

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