Одна запись выбрана более 1: м отношения - PullRequest
0 голосов
/ 16 сентября 2009

Две простые таблицы:

T1

ContactId, Название, Отдел

Т2

AddressID OwnerId Адрес Добавлено

Что мне нужно для вывода: ContactId, Имя, Отдел, Адрес, однако я хочу только одну запись на каждого клиента, самую старую на основе Добавлено (datetime).

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2009

Да, это возможно.

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

select contactid, name, department, address
from t1
inner join t2 x on t1.contactid = x.ownerid
where x.added = ( select max(t2.added) from t2 where t2.ownerid = x.ownerid )

Используйте внешнее объединение, когда хотите вернуть каждый контакт:

select contactid, name, department, address
from t1
outer join t2 x on t1.contactid = x.ownerid
where x.added = ( select max(t2.added) from t2 where t2.ownerid = x.ownerid )
1 голос
/ 16 сентября 2009

Переработать решение Фредерика, но должно быть быстрее, если AddressID - это ваш PK (кластеризованный). Также используйте LEFT JOIN, если нет адресов для контакта. Если он обязательно есть, замените INNER JOIN:

SELECT      t1.contactid, 
            t1.name, 
            t1.department, 
            t2.address
FROM        t1
LEFT JOIN   t2
        ON  t2.addressid = (SELECT  TOP 1 x.addressid 
                            FROM    t2 x 
                            WHERE   x.ownerid = t1.contactid
                            ORDER BY t2.added ASC)

Вы уверены, что хотите самый старый? Измените ASC на DESC, если вы хотите самый новый.

0 голосов
/ 16 сентября 2009

Вы можете сделать это следующим образом:

SELECT T1.contactId,T1.name,T2.department,T2.address FROM T1 INNER JOIN T2  ON T1.ContactId=T2.OwnerId INNER JOIN (SELECT OwnerId,MAX(Added) FROM T2 GROUP BY OwnerId) LatestAddress ON  T2.OwnerId=LatestAddress.OwnerId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...