2012-04-13 27 views
0

我有一個查詢,我加入了3個關係.... A,B &。加入是在一個唯一的ID。表B包含彼此相似的行,我想對錶B中的FK列(來自A的PK)執行DISTINCT。SQL Server - DISTINCT在一列

爲了使這更清楚:

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

表B可以從表A.人的多個實例,我想這是直接從一個字段的查詢,B & C對號場加盟。表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可以包含幾個約翰史密斯(同一人)誰有多個角色 - >因此我想對唯一標識一個人的號碼做一個DISTINCT。這是表A(編號)的ePK。

+0

目前尚不清楚這是否是一個SQL或LINQ( - 要-SQL)問題或什麼,因爲你已經標記所有(但不是DBMS)。 – 2012-04-13 14:59:21

+0

我相信你正在尋找的是分組。 – 2012-04-13 15:00:25

+3

您能顯示您擁有的數據和您除了的數據嗎? – Arion 2012-04-13 15:02:07

回答

0

聽起來就像你想在「否」列上使用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處於一個獨特和c具有在無

+0

事實是,所有重要的是名字的價值和不。值。一切都可以省略,因爲它不會顯示在選擇.. – user559142 2012-04-13 15:18:16

+0

你能解釋一下這個查詢背後的想法是什麼... – user559142 2012-04-13 15:56:31

+0

我認爲你說a和c之間有1比1,但是1可能在a和b之間。因此,對於每個沒有在什麼時候你想要顯示什麼時候有多個蜜蜂? Sql並不太適合把字符串聚合成類似role1,role2 ......的東西,所以一種選擇是查看最小的滾動角度,最大的滾動角色和角色數。在此基礎上查看修訂後的答案。 – automatic 2012-04-13 17:04:12

0

1比1在您的解決方案一個人可能有多個角色和多個地址。 「一列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