2011-12-01 2 views
0
Table a 
ID Name 
1 aa 
2 bb 
3 cc 

Table b 
ID Name DateTime  aID 
1 a1 2010-10-10 1 
2 b1 2010-11-10 1 
3 c1 2011-01-01 1 
4 d1 2010-09-09 2 
4 e1 2010-09-09 2 


SELECT a.Name, b.Name 
FROM Table a 
LEFT JOIN Table b ON (a.ID = b.aID, b.status = 1) 

В результате этого выше запроса мне нужна только та запись, где max (datetime) в таблице b. Результат: -Как получить самую последнюю запись с использованием TSQL?

аа, c1

Примечание: В моем реальном запросе, у меня есть много много соединений и где условия. Группа не будет работать здесь.

+0

Следует ли ВСЕГДА быть только одной строкой? Или я злоупотребляю этим, пытаясь получить max для каждой строки из A? –

+0

Tevo D. Есть несколько строк ... – User13839404

+0

Так что дайте образцы данных, должна ли быть вторая строка в результате для aID = 2? –

ответ

2
WHERE b.DateTime = (SELECT MAX(DateTime) FROM b) 
+0

В моем реальном запросе у меня более 7 объединений и 10, где условия ... Есть ли другой способ, кроме предложения WHERE? Спасибо – User13839404

+0

'WHERE' является подходящим местом для снижения вашего результата. Вы можете добавить одно и то же ограничение с 'AND' в свой' ON', но, поскольку вы выполняете левое соединение, это не обязательно приведет к сокращению списка, а скорее предоставит вам много непревзойденных полей, Значения b' будут «null». –

+0

В любом случае (условие WHERE или предложение AND в ON), его возвращающий null. и нет нулевого значения в таблице b – User13839404

0

Это метод, который использует функцию ранжирования, чтобы определить «самую большую» дату, а затем просачивается запрос. Осторожно: при определенных обстоятельствах он может не работать очень хорошо.

SELECT a.Name, b.Name 
FROM Table a 
LEFT JOIN (
    select aID, DateTime, rank() over (order by b.DateTime desc) as rownum 
    from TableB 
) b ON a.ID = b.aID and b.status = 1 
where 
b.rownum = 1 -- first row 
Смежные вопросы