SQL - выберите TOP 1 из дочерней таблицы с условием WHERE, 2 возможных значения и 1 предпочтительнее - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 2 таблицы: родитель и ребенок с отношением 1-N.

  • Person: Id (INT), имя (VARCHAR)
  • PersonToCompany: Id (INT), PersonId (INT), электронная почта (Varchar)

Я хочу присоединиться к обеим таблицам, но выбрать только 1 запись из таблицы PersonToCompany.Я знаю, что могу сделать это, например, с помощью CROSS APPLY, но у меня также есть некоторые условия.

Я хочу выбрать только определенные PersonToCompany записи, например:

WHERE (Email LIKE '%@abc.com%' OR Email LIKE '%xyz.com%')

Теперь сложная часть - некоторые люди могут иметь 2 PersonToCompany записей с обоими @ abc.com и @xyz.com почтовые домены.В этом случае я хочу быть уверен, что будет выбрана запись с @abc.com.Как я могу это сделать?

Это мой оригинальный подзапрос, который выбирает @abc.com ИЛИ @xyz.com без предпочтений:

CROSS APPLY (
    SELECT TOP 1 
    PersonToCompany.Email AS Email
    FROM PersonToCompany 
    WHERE PersonToCompany.PersonId = Person.Id
    AND (PersonToCompany.Email LIKE '%@abc.com%') OR (PersonToCompany.Email LIKE '%@xyz.com%')
) PersonToCompany

1 Ответ

0 голосов
/ 07 июня 2018

TOP 1 без ORDER BY - это «дай мне строку, мне все равно, какая».Таким образом, простое исправление заключается в добавлении ORDER BY:

CROSS APPLY (
    SELECT TOP 1 
    PersonToCompany.Email AS Email
    FROM PersonToCompany 
    WHERE PersonToCompany.PersonId = Person.Id
    AND (PersonToCompany.Email LIKE '%@abc.com%' OR
         PersonToCompany.Email LIKE '%@xyz.com%')
    ORDER BY CASE WHEN PersonToCompany.Email LIKE '%@abc.com%' THEN 0 ELSE 1 END
) PersonToCompany

(я также переместил некоторые скобки, чтобы получить правильную логику, я полагаю - вы заключали в скобки отдельные предикаты, что на самом деле несделать что-нибудь. Я заключил в скобки OR, так что совпадение PersonId требуется независимо от того, какой адрес электронной почты найден, что звучит для меня более правильно)

...