【问题标题】:SQL Server - DISTINCT on one columnSQL Server - 一列上的 DISTINCT
【发布时间】:2012-04-13 14:56:56
【问题描述】:

我有一个查询,我在其中加入 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 可以有几行的编号列具有相同的值,因此我想对编号列执行 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。

【问题讨论】:

  • 不清楚这是 SQL 问题还是 LINQ(-To-Sql) 问题或其他问题,因为您已标记所有(但不是 dbms)。
  • 我相信您正在寻找的是分组。
  • 你能把你拥有的数据和你除外的数据显示出来吗?
  • 喜见编辑 - 使用 sql server
  • 你应该使用标准的 ANSI JOIN 语法FROM A INNER JOIN B ON A.No = B.No INNER JOIN C ON B.No = C.No

标签: c# asp.net sql-server web-services


【解决方案1】:

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

一个解决方案可能是:

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

【讨论】:

  • 事实上,重要的是名称值和编号。价值。其他所有内容都可以省略,因为它不会显示在选择中..
  • 我想你是说 a 和 c 之间存在 1 比 1,但 a 和 b 之间存在 1 到可能。所以对于每一个没有,当有多个蜜蜂时你想显示什么? Sql 不太擅长将字符串聚合成诸如角色 1、角色 2 之类的东西……所以一种选择是查看最小的卷、最大的卷和角色的数量。请参阅基于此的修订答案。
【解决方案2】:

在您的解决方案中,一个人可能有多个角色和多个地址。 “一列 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多