0

我有 2 个具有多对多关系的表;一个个体可以属于许多组。一个组可以有许多个人。

个人基本上只有他们的主键 ID

组有一个主键 ID、IndividualID(与个人表中的 ID 相同)和一个位标志,用于表明该组是否是个人的主要组

理论上,组表中任何给定个体的所有条目(除一个条目外)都应将该位标志设置为 false,因为每个个体必须恰好有 1 个主组。

我知道对于我当前的数据集,这个假设不成立,并且我有一些个人将所有组的主要标志设置为 false。

我无法生成将这些人返回给我的查询。

我得到的最接近的是:

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

但是比 SUM 或 MAX 更进一步是行不通的,因为该字段是位字段,而不是数字。

有什么建议么?

4

7 回答 7

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

如果您需要进行 SUM 和 MAX,请尝试不要使用位字段 - 改用 TINYINT。另外,据我所知,位字段不能被索引,所以你会在你的连接中失去一些性能。

于 2009-01-28T20:35:30.907 回答
1

更新:让它与子选择一起使用。从主要组为假的组中选择个人ID,并且个人ID NOT IN(从主要组为真的组中选择个人ID)

于 2009-01-28T20:56:49.460 回答
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 回答
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 回答