2017-02-06 11 views
0

Допустим, у меня есть эта таблица:SQL: Выравнивание по левому краю, но выбрать только одну строку с наименьшим создал дату

Таблица A:

id name  
--- --- 
1 John 

Таблица B:

id  content Aid  Date 
    ---  ---  ---  ---------- 
    100  abc  1  2017-02-03 11:16:00 
    101  xyz  1  2017-02-03 11:50:00 

Я хочу соедините A и B так, чтобы итоговая таблица имела только одну строку из B с Date = minimum.

Мой желаемый результат:

id name content 
--- --- ------ 
1 John abc 

Моя неудавшаяся попытка объединения дает мне (1, Джон, хуг) ряд, а также:

SELECT A.[id], A.[name], B.[content] 
FROM A 
LEFT JOIN B 
ON A.id = B.Aid 

Позже я пытался делать WHERE внутри присоединиться, но Я не могу это построить:

SELECT A.[id], A.[name] 
FROM A 
LEFT JOIN B 
ON A.id = (SELECT Aid FROM B WHERE Date = (SELECT MIN(Date) FROM B 
WHERE <no idea where I'm going?>) 

Может кто-нибудь указать мне в правильном направлении?

ответ

1
SELECT A.[id], A.[name],B.[content] 
FROM A 
LEFT JOIN B 
ON A.id = B.Aid 
AND B.Date = (Select Min(Date) from B as B2 where B2.Aid=A.id) 
+0

Если в A и B присутствует несколько значений, ваш запрос дает мне только 1 строку в результирующем наборе. Эта строка поворачивается на первую запись в B с наименее созданной датой. Не следует ли подзапрос выбирать Min (Date) из B WHERE xyz? – 90abyss

+0

обновил ответ –

+0

теперь отлично работает! благодаря!! :) – 90abyss

0

Почему вы не используете SELECT TOP 1 с ORDER BY B.DATE DESC?

+1

Это должен быть комментарий, а не ответ. –

1

Вы можете использовать левые присоединиться к производной таблице:

SELECT a.ID, a.Name, b.Content 
FROM a 
LEFT JOIN 
(
    SELECT aId, content, ROW_NUMBER() OVER (PARTITION BY aId ORDER BY Date) rn 
    FROM b   
) b ON(a.Id = b.AId AND b.rn = 1) 

Функция row_number окна начинается с 1 для каждого aId с минимальной датой, поэтому вам нужно добавить условие AND b.rn = 1 к о п , Если бы вы добавили его в пункт where, это повлияло бы на изменение вашего левого соединения на внутреннее соединение.

+0

Спасибо за ваш ответ! это работает как ожидалось. можете ли вы взглянуть на ответ Митилеша? Я попробовал запустить оба, но нет разницы во времени выполнения. Я не уверен, какой из них выбрать. Вы можете помочь? – 90abyss

+0

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

0

Вы можете использовать OUTER APPLY.

SELECT a.ID, a.Name, b.Content 
FROM a 
OUTER APPLY 
(
    SELECT TOP (1) * 
    FROM b 
    WHERE b.aid = a.id 
    ORDER BY Date ASC 
) b