我有3张桌子。首先是帐户表,然后是联系人表和电话表。
我试图在这里写的查询的要求是,对于给定的帐户,显示顶部的主要联系人及其所有电话号码,然后显示按名称排序的其余联系人。电话也必须以预定义的顺序出现。首先是家庭电话号码,然后是工作电话号码等。
这是我到目前为止所拥有的
SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, a1.MainContactID
FROM Contact c
JOIN Phone p ON p.ContactID = c.ContactID
JOIN Account a1 ON a1.AccountID= c.AccountID
WHERE a1.AccountID= 1000
ORDER BY
c.FullName,
CASE PhoneCategory
WHEN 'Home Phone' THEN 1
WHEN 'Business Phone' THEN 2
WHEN 'Cell Phone' THEN 3
WHEN 'Fax' THEN 4
WHEN 'Other Phone' THEN 5
WHEN 'Email Address' THEN 6
WHEN 'E-Mail' THEN 6
END
通过运行此命令,我获得按名称排序的列表,并且数字也以正确的顺序显示。唯一的问题是我无法确定如何让maincontact显示在顶部
编辑:输入了c1.MainContactID而不是a1
答案 0 :(得分:1)
我认为如果你展示了更多的数据库架构会有所帮助。即:您如何确定某些联系人是主要联系人?
我有两个想法:
MainContactID
相对应?在这种情况下,我想通过在MainContactID
列上使用Left Outer Join然后对其进行排序,您可以通过一个查询来执行此操作?对于其他联系人,此列将为NULL,对吧?答案 1 :(得分:1)
目前尚不清楚c1
是什么 - 但是如果它是一个未显示的连接,它为主要联系人提供了id,而非主要联系人则为null,那么您的查询应该如下所示:
SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, c1.MainContactID
FROM Contact c
JOIN Phone p ON p.ContactID = c.ContactID
JOIN Account a1 ON a1.AccountID= c.AccountID
WHERE a1.AccountID= 1000
ORDER BY
CASE
WHEN a1.MainContactID = c.ContactID THEN 1
ELSE 0
END,
c.FullName,
CASE PhoneCategory
WHEN 'Home Phone' THEN 1
WHEN 'Business Phone' THEN 2
WHEN 'Cell Phone' THEN 3
WHEN 'Fax' THEN 4
WHEN 'Other Phone' THEN 5
WHEN 'Email Address' THEN 6
WHEN 'E-Mail' THEN 6
END