1

我有 3 张桌子。首先是 account 表,然后是 contact 表和 phone 表。

我试图在这里编写的查询的要求是,对于给定的帐户,在顶部显示主要联系人及其所有电话号码,然后显示按姓名排序的其余联系人。电话还必须以预定义的顺序出现。首先是家庭电话号码,然后是工作电话号码等。

这是我到目前为止所拥有的

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

4

2 回答 2

1

我认为如果您显示更多的数据库模式会有所帮助。即:您如何确定某个联系人是主要联系人?

我有两个想法:

  1. 您可以使用两个单独的查询并使用 UNION 命令来创建一个结果集。
  2. 从我在这里看到的情况来看,我想对于一个主要联系人,它的 ID 对应于MainContactID一个帐户的 ID?在那种情况下,我认为您可以通过在列上使用左外连接MainContactID然后对其进行排序来完成一个查询?对于其他联系人,此列将为 NULL,对吗?
于 2013-10-19T18:59:51.887 回答
1

目前尚不清楚是什么c1- 但如果它是一个未显示的连接,它为您提供主要联系人的 id 和非主要联系人的空值,那么您的查询应该如下所示:

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 
于 2013-10-19T19:05:07.287 回答