0

多対多の関係を持つ 2 つのテーブルがあります。個人は多くのグループに所属できます。グループは多くの個人を持つことができます。

個人は基本的にプライマリキー ID を持っているだけです

グループには、プライマリ キー ID、個人 ID (個人テーブルの ID と同じ)、およびそのグループが個人のプライマリ グループであるかどうかを示すビット フラグがあります。

理論的には、グループ テーブル内の特定の個人の 1 つを除くすべてのエントリは、そのビット フラグを false に設定する必要があります。これは、すべての個人が 1 つのプライマリ グループを持つ必要があるためです。

私の現在のデータセットでは、この仮定が当てはまらないことはわかっています。また、すべてのグループのプライマリ フラグが false に設定されている個人が何人かいます。

それらの個人を返すクエリを生成するのに問題があります。

私が得た最も近いものは次のとおりです。

SELECT * FROM 個人 i LEFT JOIN グループ g ON g.IndividualID = i.ID WHERE g.IsPrimaryGroup = 0

しかし、フィールドは数値ではなくビット フィールドであるため、SUM または MAX を使用してさらに先に進むことはできません。

助言がありますか?

4

7 に答える 7

1

SUM と MAX を実行する必要がある場合は、ビット フィールドを使用しないでください。代わりに TINYINT を使用してください。さらに、私が覚えていることから、ビット フィールドにはインデックスを付けることができないため、結合のパフォーマンスが低下します。

于 2009-01-28T20:35:30.907 に答える
1

あなたのデータを知りません...しかし....そのLEFT JOINはINNER JOINです

WHERE を AND に変更するとどうなるか

SELECT * FROM Individual i 
LEFT JOIN Group g ON g.IndividualID = i.ID 
AND g.IsPrimaryGroup = 0

ここでこれを実行してみてください...十分なデータを提供しなかったため、もちろんテストされていません

SELECT SUM(convert(int,g.IsPrimaryGroup)), i.ID 
FROM Individual i 
LEFT JOIN [Group] g ON g.IndividualID = i.ID 
AND g.IsPrimaryGroup = 0
GROUP BY i.ID
HAVING COUNT(*) > 1
于 2009-01-28T20:25:20.397 に答える
1

更新:サブセレクトで動作するようになりました。プライマリ グループが false のグループから IndividualID を選択し、individualID NOT IN (プライマリ グループが true のグループから IndividualID を選択)

于 2009-01-28T20:56:49.460 に答える
0
SELECT IndividualID
FROM Group g
WHERE NOT EXISTS (
    SELECT NULL FROM Group
    WHERE PrimaryOrg = 1
    AND IndividualID = g.IndividualID)
GROUP BY IndividualID
于 2009-01-28T21:25:01.133 に答える
0

IsPrimaryGroup 条件を JOIN 句に含める必要があります。このクエリは、PrimaryGroup が設定されていないすべての個人を検索します。

SELECT * FROM Individual i
LEFT OUTER JOIN Group g ON g.IndividualID = i.ID AND g.IsPrimaryGroup = 1
WHERE g.ID IS NULL

ただし、(リレーショナル データベースに関して) 問題を解決する理想的な方法は、Individual テーブルに PrimaryGroupID を設定することです。

于 2009-01-28T20:23:48.340 に答える
0
SELECT COUNT(bitflag),individualId 
FROM Groups
WHERE bitflag = 1
GROUP BY individualId
ORDER BY SUM(bitFlag)
HAVING COUNT(bitFlag) <> 1

これにより、各個人と、その一次グループの数がわかります

于 2009-01-28T20:58:33.433 に答える
0

これがパフォーマンスの観点から最適かどうかはわかりませんが、これらの線に沿った何かが機能すると信じています。個人とグループの間の解決テーブルの名前として OrgIndividual を使用しています。

SELECT DISTINCT(i.IndividualID)
FROM
  Individual i INNER JOIN OrgIndividual oi
    ON i.IndividualID = oi.IndividualID AND oi.PrimaryOrg = 0
  LEFT JOIN OrgIndividual oip
    ON oi.IndividualID = oip.IndividualID AND oi.PrimaryOrg = 1
WHERE
  oi2.IndividualID無効です

于 2009-01-28T21:00:28.033 に答える