我有2张表有多对多的关系;个人可以属于许多群组。一个集团可以有很多个人。
个人基本上只有主键ID
组具有主键ID,IndividualID(与单个表中的ID相同),以及如果该组是个人的主要组的位标志
理论上,组表中任何给定个体的其中一个条目都应该将该位标志设置为false,因为每个人必须只有一个主要组。
我知道对于我当前的数据集,这个假设不成立,我有一些人将所有组的主要标志设置为false。
我无法生成一个将这些人归还给我的查询。
我最接近的是:
SELECT * FROM个人i LEFT JOIN组g ON g.IndividualID = i.ID 在哪里g.IsPrimaryGroup = 0
但是使用SUM或MAX更进一步不起作用,因为该字段是位字段,而不是数字。
有什么建议吗?
答案 0 :(得分: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
答案 1 :(得分:1)
如果需要使用SUM和MAX,请尝试不使用位字段 - 请改用TINYINT。另外,根据我的记忆,无法对位字段进行索引,因此您将在连接中失去一些性能。
答案 2 :(得分:1)
更新:使用subselect进行处理。从Group中选择IndividualID,其中主要组为false,而IndividualID为IN(从主要组为true的Group中选择IndividualID)
答案 3 :(得分: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。
答案 4 :(得分:0)
SELECT COUNT(bitflag),individualId
FROM Groups
WHERE bitflag = 1
GROUP BY individualId
ORDER BY SUM(bitFlag)
HAVING COUNT(bitFlag) <> 1
这将为您提供每个人以及他们拥有的主要群体
答案 5 :(得分:0)
从性能的角度来看,我不知道这是否是最佳的,但我相信这些方面应该有所作为。我使用OrgIndividual作为Individual和Group之间的分辨率表的名称。
SELECT DISTINCT(i.IndividualID)
从
个人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 IS NULL
答案 6 :(得分:0)
SELECT IndividualID
FROM Group g
WHERE NOT EXISTS (
SELECT NULL FROM Group
WHERE PrimaryOrg = 1
AND IndividualID = g.IndividualID)
GROUP BY IndividualID