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 からの人物の複数のインスタンスを含めることができます。No. フィールドで結合された 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 には、複数の役割を持つ複数のジョン スミス (同一人物) が含まれる可能性があります。したがって、個人を一意に識別する No. に対して DISTINCT を実行したいと考えています。これは、表 A (No.) の ePK です。

4

2 に答える 2

0

ソリューションでは、1 人が複数の役割と複数のアドレスを持つ場合があります。「1列DISTINCT」にはサブクエリのトリックが必要です(他の人がすでに示したように)。しかし、クエリが 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
于 2012-04-13T22:12:52.290 に答える
0

いいえ、列で group by を使用して結果を要約したいようです。問題は、No. の値が同じ場合に、他の列の異なる値をどうしたいのかということです。

1つの解決策は次のとおりです。

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 に答える