我有一张公司电话号码表,其中一列是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
的电话号码?
答案 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