用于位字段的SQL逻辑AND运算符

时间:2009-01-28 20:19:21

标签: sql bit-manipulation

我有2张表有多对多的关系;个人可以属于许多群组。一个集团可以有很多个人。

个人基本上只有主键ID

组具有主键ID,IndividualID(与单个表中的ID相同),以及如果该组是个人的主要组的位标志

理论上,组表中任何给定个体的其中一个条目都应该将该位标志设置为false,因为每个人必须只有一个主要组。

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

我无法生成一个将这些人归还给我的查询。

我最接近的是:

SELECT * FROM个人i LEFT JOIN组g ON g.IndividualID = i.ID       在哪里g.IsPrimaryGroup = 0

但是使用SUM或MAX更进一步不起作用,因为该字段是位字段,而不是数字。

有什么建议吗?

7 个答案:

答案 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