位字段的SQL逻辑AND运算符

位字段的SQL逻辑AND运算符,sql,bit-manipulation,Sql,Bit Manipulation,我有两个具有多对多关系的表;一个人可以属于许多群体。一个团体可以有许多个人 个人基本上只有他们的主键ID 组有一个主键ID,IndividualID与单个表中的ID相同,还有一个位标志,用于指示该组是否是该个人的主组 理论上,组表中任何给定个体的所有条目(只有一个除外)都应该将该位标志设置为false,因为每个个体必须正好有一个主组 我知道,对于我当前的数据集,这个假设不成立,我有一些个人的所有组的主标志都设置为false 我无法生成将这些个人返回给我的查询 我得到的最接近的结果是: 从单个i中

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

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

组有一个主键ID,IndividualID与单个表中的ID相同,还有一个位标志,用于指示该组是否是该个人的主组

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

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

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

我得到的最接近的结果是:

从单个i中选择* 在g.IndividualID=i.ID上左连接组g 其中g.IsPrimaryGroup=0

但是,如果使用SUM或MAX,则无法进一步使用SUM或MAX,因为该字段是位字段,而不是数字字段


有什么建议吗?

您需要在JOIN子句中包含IsPrimaryGroup条件。此查询查找未设置PrimaryGroup的所有个人:

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

但是,解决关系数据库问题的理想方法是在单个表中使用PrimaryGroupID。

您需要将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

但是,解决关系数据库问题的理想方法是在单个表中有一个PrimaryGroupID。

不知道您的数据……但是……左连接是一个内部连接

当您更改“到何处”和“到何处”时会发生什么

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

不知道你的数据…但是…左连接是一个内部连接

当您更改“到何处”和“到何处”时会发生什么

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

如果您需要求和和和最大值,请尝试不使用位字段-改用TINYINT。此外,据我所知,位字段不能被索引,因此在联接中会失去一些性能。

如果需要求和和和最大值,请尝试不使用位字段-改用TINYINT。此外,据我所知,位字段不能被索引,因此您的联接将失去一些性能。

更新:使其与子选择一起工作。从主组为false的组中选择IndividualID,从主组为true的组中选择IndividualID不在其中更新:使其与子选择一起工作。在主组为false的组中选择IndividualID,在主组为true的组中选择IndividualID不在其中

SELECT COUNT(bitflag),individualId 
FROM Groups
WHERE bitflag = 1
GROUP BY individualId
ORDER BY SUM(bitFlag)
HAVING COUNT(bitFlag) <> 1
这将告诉你每个人以及他们有多少主要群体


这将告诉你每个人以及他们有多少个主要群体,我不知道从性能的角度来看这是否是最佳的,但我相信沿着这些思路应该会奏效。我使用OrgIndividual作为Individual和Group之间解析表的名称。选择Differentic.IndividualID 从…起 个人内部连接组织个人 在i.IndividualID=oi.IndividualID和oi.PrimaryOrg=0上 左联合组织 在oi.IndividualID=oip.IndividualID和oi.PrimaryOrg=1上 哪里
oi2.IndividualID为NULL

我不知道从性能的角度来看这是否是最佳的,但我相信按照这些原则应该可以做到。我使用OrgIndividual作为Individual和Group之间解析表的名称。选择Differentic.IndividualID
SELECT IndividualID
FROM Group g
WHERE NOT EXISTS (
    SELECT NULL FROM Group
    WHERE PrimaryOrg = 1
    AND IndividualID = g.IndividualID)
GROUP BY IndividualID
从…起 个人内部连接组织个人 在i.IndividualID=oi.IndividualID和oi.PrimaryOrg=0上 左联合组织 在oi.IndividualID=oip.IndividualID和oi.PrimaryOrg=1上 哪里
oi2.IndividualID为NULL

仅供参考,如果您的db支持EXISTS子句,则通常更快,因为它更好地使用索引。请看我下面的帖子。仅供参考,如果您的数据库支持EXISTS子句,它通常会更快,因为它更好地使用索引。见下面我的帖子。
SELECT IndividualID
FROM Group g
WHERE NOT EXISTS (
    SELECT NULL FROM Group
    WHERE PrimaryOrg = 1
    AND IndividualID = g.IndividualID)
GROUP BY IndividualID