Соединить две таблицы и вернуть только одну строку из второй таблицы

У меня есть две таблицы. Обе таблицы содержат идентификатор, который можно использовать для их объединения. Однако таблица 2 может иметь more than one row for the same ID. Таблица 1 всегда будет иметь одну строку.

Например, table 1 содержит 60 000 строк. Когда я выполняю левое внутреннее соединение с table2, оно возвращает ~171 000 строк.

То, что я пытаюсь сделать, это вернуть первую строку из таблицы 2, поэтому, когда я присоединяюсь к ним, я не создаю повторяющиеся записи.

Я не уверен, что это правильный подход, но это то, что я пробовал:

SELECT I.*, a.Name from table 1 I 
INNER JOIN (SELECT MIN (a.ID), a.NAME FROM table 2 group by a.ID) as a 
on I.ID = a.ID

Я получаю следующую ошибку:

Неправильный синтаксис рядом с «i».

Любые предложения о том, как я могу это исправить? Или получить результат другим способом?


person smr5    schedule 15.10.2014    source источник
comment
в этой таблице 1 есть это место? между «таблицей» и «1» в вашем запросе? поместите 1 вместе с таблицей или удалите ее, чтобы удалить описанную вами ошибку.   -  person Deiwys    schedule 16.10.2014
comment
Похоже, вам нужен псевдоним для MIN(a.ID) в производной таблице. Технически в этом наборе результатов нет столбца ID.   -  person Dave Johnson    schedule 16.10.2014
comment
Также я вообще не вижу ни одной строчной буквы i в этом коде.   -  person Aaron Bertrand    schedule 16.10.2014


Ответы (1)


Что-то вроде этого гарантирует одну строку для каждого идентификатора из вашей второй таблицы.

;WITH singleRows AS (
SELECT
    *
    , ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) as rownum
FROM
    table_2)

SELECT
    *
FROM
    table_1 t1

    JOIN singleRows t2
        ON t1.id = t2.id
        AND t2.rownum = 1
person Ryan B.    schedule 15.10.2014
comment
Благодарю вас! Это то, что я искал. - person smr5; 16.10.2014
comment
Это почти сработало, но по какой-то причине, если table_2 имеет 50 записей для одной записи в table_1. Запрос показывает 50 записей с одинаковыми данными. - person Si8; 13.11.2020