Вернуть число строк, которые находятся в моей левой таблице соединения 1, T-SQL? - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно указать один результат возврата для левого соединения, где в таблице есть несколько дубликатов. Запрос уже сложный, поэтому у меня проблемы с размещением.

Я думаю, что мне нужно использовать раздел с помощью, но я не получил ни одной из моих попыток запуска. Max(T2.ord_creatd_dt) не бежал.

Запрос:

SELECT  
    T1.EMAIL, T2.BILLG_STATE_CD, T2.BILLG_ZIP_CD, T2.ord_creatd_dt
FROM
    (SELECT EMAIL
     FROM SJ_FPQ_Q1_19
     UNION
     SELECT EMAIL
     FROM SJ_FPQ_Q2
     UNION
     SELECT email AS EMAIL
     FROM Amber_10182019) AS T1
LEFT JOIN 
    ORD_MSTR As T2 ON T1.EMAIL = T2.EMAIL_ADDR
WHERE 
    T2.ord_creatd_dt > DATE '2018-01-01' 
    AND T2.ord_creatd_dt < DATE '2019-11-08'

Возвращенные результаты:

service@lip.com NY  108012233   11/4/2019
none            ?       ?       4/9/2018

Мне нужен только один результат для каждого электронного письма в T1.

1 Ответ

0 голосов
/ 08 ноября 2019

Для этого вы можете использовать оператор apply. Ваш код становится:

SELECT  T1.EMAIL, T2.BILLG_STATE_CD, T2.BILLG_ZIP_CD, T2.ord_creatd_dt
    FROM
    (
        SELECT  EMAIL
            FROM    SJ_FPQ_Q1_19
            UNION
    SELECT  EMAIL
            FROM    SJ_FPQ_Q2
            UNION
    SELECT  email As EMAIL
        FROM    Amber_10182019) As T1
OUTER APPLY (
    SELECT TOP 1 * 
    FROM ORD_MSTR As TA 
    WHERE TA.ord_creatd_dt > CAST('2018-01-01' AS date)
      AND TA.ord_creatd_dt < CAST('2019-11-08' AS date)
      AND T1.EMAIL =TA.EMAIL_ADDR
    ORDER BY TA.ord_creatd_dt ASC
) AS T2

В этом случае я установил предложение ORDER BY так, чтобы возвращалась самая ранняя совпадающая запись, при необходимости вы можете изменить это для некоторой другой логики.

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

...