C# SQL Server-在一列上是不同的
我有一个查询,在那里我加入了3个关系…a,B和。联接位于唯一的id上。表B包含彼此相似的行,我想对表B中的FK列(a中的PK)执行一个DISTINCT 为了更清楚地说明这一点:C# SQL Server-在一列上是不同的,c#,asp.net,sql-server,web-services,C#,Asp.net,Sql Server,Web Services,我有一个查询,在那里我加入了3个关系…a,B和。联接位于唯一的id上。表B包含彼此相似的行,我想对表B中的FK列(a中的PK)执行一个DISTINCT 为了更清楚地说明这一点: A B C --------- --------- --------- No. (PK) Id(PK) Id (PK) Name Role Address No.(
A B C
--------- --------- ---------
No. (PK) Id(PK) Id (PK)
Name Role Address
No.(FK) No.(FK)
表B可以有来自表A的多个人员实例。我需要一个查询,该查询从编号字段上连接的A、B和C中提取字段。表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 Smith(同一个人)->因此我想在唯一标识一个人的编号上做一个区分。这是表A(编号)中的ePK。听起来您想使用编号列中的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的在您的解决方案中,一个人可能有多个角色和多个地址。“一列不同”需要子查询技巧(正如其他人已经向您展示的)。但是,如果您的查询是为每个人显示主要(或只是其中一个)角色和主要地址,那么您的查询可能会简单得多
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
现在还不清楚这是一个SQL问题还是一个LINQ(-To SQL)问题,或者其他什么问题,因为您已经标记了all(但不是dbms)。我相信您正在寻找的是分组。您能显示您拥有的数据和您排除的数据吗?您好,请参阅编辑-使用sql Server您应该使用标准的ANSI连接语法
,从A上的内部连接B开始。No=B。B上的内部连接C。No=C。No
事实上,所有重要的是名称值和编号值。其他一切都可以省略,因为它不会显示在选择栏中。我想你是说a和c之间是1比1,但a和b之间是1比5。那么对于一个模型中的每一个否定,当有多个蜜蜂时,你想展示什么呢?Sql不太擅长将字符串转换为类似role1、role2,。。。因此,一个选项是查看最小卷、最大卷和角色数。请参阅基于此修改的答案。