0

我有一个查询,我在哪里加入 3 个关系....A,B &。加入是在一个唯一的 id 上。表 B 包含彼此相似的行,我想对表 B 中的 FK 列(来自 A 的 PK)执行 DISTINCT。

为了更清楚地说明这一点:

    A              B           C
---------      ---------   ---------
No. (PK)       Id(PK)       Id (PK)
Name           Role         Address
               No.(FK)      No.(FK)

表 B 可以有来自表 A 的多个人员实例。我想要一个查询,该查询从 A、B 和 C 中提取字段,并加入 No. 字段。表 B 可以有几行与 No. 列的值相同,因此我想对 No. 列执行 DISTINCT。

我怎样才能做到这一点?

示例数据:

NAME          ROLE       ADDRESS
---------------------------------------
John Smith    Manager    1, The Village
Dawn French   Secretary  2, The City
John Smith    SQL Dev    1, The Village
Terry Tibbs   HR Manager 8, The Road

这是连接关系 A、B 和 C 的示例:

 SELECT A.Name, B.Role, C.Address 
 FROM A, B, C 
 WHERE A.No = B.No AND B.No = C.No

表 B 可能包含几个具有多个角色的 John Smiths(同一个人)-> 因此我想在唯一标识一个人的编号上做一个 DISTINCT。这是表 A(编号)的 ePK。

4

2 回答 2

0

在您的解决方案中,一个人可能有多个角色和多个地址。“一列 DISTINCT”需要子查询技巧(正如其他人已经向您展示的那样)。但是,如果您的查询是显示每个人的主要(或只是其中之一)角色和主要地址,那么您的查询可能会简单得多。

SELECT
A.Name,
(SELECT TOP 1 Role FROM B WHERE B.No = A.No) AS PrimaryRole, -- you may add ORDER BY here
(SELECT TOP 1 Address FROM C WHERE C.No = A.No) AS PrimaryAddress, -- add ORDER BY
FROM A
ORDER BY A.Name
于 2012-04-13T22:12:52.290 回答
0

听起来您想在否列上使用 group by 来总结您的结果。问题是当编号值相同时,您想对其他列中的不同值做什么?

一种解决方案可能是:

select a.No, a.Name, 
b.MinRole, b.MaxRole, b.RoleCount,
c.Address
from a 
join (
  select b.No, Min(b.Role) as MinRole, Max(b.Role) as MaxRole, 
  Count(distinct b.Role) as RoleCount
  from b group by b.No
) as b on a.No = b.No
join c on a.No = c.No

这假设 a.No 在 a 中是唯一的,并且 a 和 c 在 No 上具有 1 比 1

于 2012-04-13T15:06:24.963 回答