SQL объединяет две таблицы, используя минимальное значение из второй таблицы

у меня Т1

ID STATUS
1  NEW
2  NEW

у меня Т2

T1ID  OWNER  OWNDATE

1      A      01.01.2017 10:00:00
1      B      02.02.2017 10:00:00
1      C      03.03.2017 10:00:00
2      B      02.02.2017 10:00:00
2      C      03.03.2017 10:00:00

Поскольку A для ID 1 имеет минимальную OWNDATE, а B для ID 2 имеет минимальную OWNDATE

хочу получить в результате

1  NEW  A
2  NEW  B

Но после соединения я не уверен, куда поставить MIN, чтобы я мог найти минимум из двух таблиц.

SELECT 
    T1.ID, T1.STATUS, T2.OWNER
FROM 
    T1 
JOIN 
    T2 ON T1.ID = T2.T1ID

заранее спасибо


person Veljko    schedule 16.04.2017    source источник
comment
Пожалуйста, укажите СУБД, которую вы используете, например, MySQL, SQL-Server, Oracle и, если известно, номер версии. Некоторые разновидности SQL позволяют использовать методы, которые могут дать более эффективные ответы.   -  person Steve Lovell    schedule 16.04.2017
comment
Я сделал это сейчас - db2. Спасибо   -  person Veljko    schedule 16.04.2017


Ответы (2)


Ниже приведено решение на простом SQL с использованием подзапроса, оно должно работать в большинстве баз данных.

SELECT 
    T1.ID, T1.STATUS, T2.OWNER
FROM 
    T1 
JOIN 
    T2
ON T1.ID = T2.T1ID 
   AND t2.owndate = (
       select min( owndate ) FROM t2
       where t2.T1ID = t1.id
)
person krokodilko    schedule 16.04.2017
comment
У меня вопрос. Почему в подзапросе вы используете where? Я имею в виду, связанные с производительностью? - person GSandro_Strongs; 26.06.2020

В большинстве СУБД вы можете использовать аналитические функции Windows.

SELECT T1.ID,
      T1.STATUS,
      T.OWNER
FROM T1
  INNER JOIN
(SELECT t2.*,
      row_number() over(partition BY t1id
                        ORDER BY owndate) AS seq
  FROM t2
 ) t 
   ON t1.id=t.t1id
   AND t.seq=1
person Utsav    schedule 16.04.2017