TSQL выбрать запись, соответствующую критериям или первой - PullRequest
0 голосов
/ 20 марта 2019

У меня есть таблица для телефонных номеров компании, и один из столбцов - IsPrimary, тип boolean. Таблица выглядит так:

CompanyId  |  AreaCode  |  PhoneNumber | IsPrimary
123            212         555-1212      0
234            307         555-1234      1
234            307         555-4321      0

Как видно из первой записи, хотя телефонный номер является единственным для CompanyId: 123, он не помечается как основной.

В таких случаях я хочу, чтобы мой оператор SELECT возвратил первый доступный номер для этой компании.

Мой текущий оператор SELECT выглядит так, что НЕ возвращает число, если оно не установлено в качестве основного.

SELECT *
FROM CompanyPhoneNumbers AS t
WHERE t.IsPrimary = 1

Как я могу изменить этот оператор SELECT, чтобы он включал номер телефона для CompanyId: 123?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Вы можете достичь этого, используя заявление о применении.Он просматривает ту же самую таблицу и возвращает запись с наибольшим значением IsPrimary, поэтому он возвращает записи с 1 в этом столбце.Если их несколько, помеченных как первичные или не первичные, возвращается номер телефона с кодом города в порядке возрастания.

select      b.*
from        CompanyPhoneNumbers     a
cross apply (
                select      top 1
                            *
                from        CompanyPhoneNumbers b
                where       b.CompanyId = a.CompanyId
                order by    b.IsPrimary desc
                            ,b.AreaCode
                            ,b.PhoneNumber
            )                       b
0 голосов
/ 20 марта 2019

Запрос может отличаться в зависимости от того, что вы на самом деле делаете.

Если у вас уже есть CompanyId и вам нужен только номер телефона, это просто:

select top (1) pn.*
from dbo.CompanyPhoneNumbers pn
where pn.CompanyId = @CompanyId -- A parameter provided externally, by calling code for instance
order by pn.IsPrimary desc;

Однако, если вам нужны данные всех компаний, включая один из их телефонов (например, вы можете создать представление для этого), вам нужен коррелированный подзапрос:

select c.*, oa.*
from dbo.Companies c
  outer apply (
    select top (1) pn.*
    from dbo.CompanyPhoneNumbers pn
    where pn.CompanyId = c.Id
    order by pn.IsPrimary desc
    ) oa;

Я намеренно использовал outer вместо cross, в противном случае он отфильтрует компании, в которых нет номеров телефонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...