TSQL选择符合条件或第一个条件的记录

时间:2019-03-20 00:29:36

标签: sql-server tsql

我有一张公司电话号码表,其中一列是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 :(得分:0)

查询可能会有所不同,具体取决于您的实际工作。

如果您已经有了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进行申请,否则它将过滤掉未列出电话号码的公司。

答案 1 :(得分:0)

您可以使用apply语句实现此目的。这将查找完全相同的表,并返回具有最高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