2009-01-28 45 views
0

我有2個表具有多對多關係;一個人可以屬於許多團體。一個集團可以有很多個人。用於位域的SQL邏輯AND運算符

個體基本上只是有他們的主鍵ID

組有一個主鍵ID,IndividualID(相同於各個表的ID),以及用於如果該組是爲個體的主組的位標記

理論上,組表中任何給定個體的所有條目都應該將該位標誌設置爲false,因爲每個個體必須只有一個主組。

我知道,對於我當前的數據集,這種假設並不適用,並且我有一些個人將其所有組的主標誌設置爲false。

我在生成將返回這些個人給我的查詢時遇到問題。

我已經得到最接近的是:

SELECT * FROM個體i LEFT JOIN組G ON g.IndividualID = i.ID WHERE g.IsPrimaryGroup = 0

但比進一步去與SUM或MAX不起作用,因爲該字段是位字段,而不是數字。

有什麼建議嗎?

回答

0

您需要在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在單個表。

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

儘量不要使用位字段,如果你需要做的SUM和MAX - 使用TINYINT代替。另外,從我記得的位字段不能被索引,所以你會在你的連接中失去一些性能。

1

更新:使用子查詢得到它。從羣裏的主要組是假的,individualID NOT IN選擇IndividualID(從集團選擇IndividualID其中主要組爲true)

+0

只是一個參考,如果您的數據庫支持EXISTS子句,它通常更快,因爲它更好地使用索引。看到我的帖子下面。 – Dylan 2009-01-28 21:27:01

0
SELECT COUNT(bitflag),individualId 
FROM Groups 
WHERE bitflag = 1 
GROUP BY individualId 
ORDER BY SUM(bitFlag) 
HAVING COUNT(bitFlag) <> 1 

這會給你每個人多少主要羣體,他們有

0

我不知道從性能角度來看這是否是最佳選擇,但我相信沿着這些方向應該起作用。我使用OrgIndividual作爲Individal和Group之間的解析表的名稱。

SELECT DISTINCT(i。IndividualID)
FROM
   個體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
其中
    oi2.IndividualID I S NULL

0
SELECT IndividualID 
FROM Group g 
WHERE NOT EXISTS (
    SELECT NULL FROM Group 
    WHERE PrimaryOrg = 1 
    AND IndividualID = g.IndividualID) 
GROUP BY IndividualID