Выберите отдельный + выберите верхний, чтобы объединить несколько строк

Я пытаюсь выбрать строки из таблицы, по одной строке на адрес электронной почты, и вернуть одно имя из верхней строки в списке адресов электронной почты. Однако запрос возвращает несколько адресов электронной почты. Что я делаю не так?

SELECT 
    DISTINCT email,
    (SELECT TOP 1 firstname 
     FROM onsite_clients_archive oc 
     WHERE oc.client_id=oca.client_id 
     ORDER BY client_id)
FROM onsite_clients_archive oca 
WHERE users_user_id IS NULL

person Caveatrob    schedule 11.12.2009    source источник
comment
Какая база данных? Запрос выглядит правильно - пожалуйста, покажите некоторые данные и ожидаемый результат.   -  person OMG Ponies    schedule 11.12.2009


Ответы (2)


Ваша ошибка WHERE oc.client_id = oca.client_id должна быть WHERE oc.email = oca.email.

Вы не сказали, какую СУБД вы используете, но если это MS SQL, следующее также будет делать то, что вы хотите.

SELECT email, firstname
FROM (
    SELECT 
        email, firstname, 
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY client_id DESC) AS intRow
    FROM onsite_clients_archive
    WHERE users_user_id IS NULL
) AS T
WHERE intRow = 1
person Paul    schedule 11.12.2009

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

Подумайте о том, что вы пытаетесь сделать ... вам нужен каждый отдельный (не обязательно здесь ключевое слово SQL) адрес электронной почты с первым именем, которое соответствует ему (сначала определяется порядком client_id). Мне трудно сказать определенно, не видя реальной модели данных, но вот мое первое предположение:

SELECT
     T1.email,
     T1.first_name
FROM
     Onsite_Clients_Archive T1
LEFT OUTER JOIN Onsite_Clients_Archive T2 ON
     T2.email = T1.email AND
     T2.client_id < T1.client_id
WHERE
     T2.client_id IS NULL   -- Assuming that this is a not null column, the only way it could be NULL is if there was no match
person Tom H    schedule 11.12.2009