我确信这是一个常见问题,但我似乎无法想出答案。
如果我有一对一关系的表,我该如何实现一个查询,其中必须满足关系“很多”方面的所有指定项目才能返回记录? / p>
例如
Person Person_Feature Feature PersonID Name PersonID FeatureID FeatureID Description 1 Dave 1 1 1 Tall 2 Bill 1 2 2 Black 1 3 3 Male 2 1 4 White 2 4 2 3
如果我允许用户从功能表中选择功能,我将如何编写一个查询,该查询只返回一个全部所选功能的人,但很少或很多可能是?
因此寻找一个身材高大的黑人男性会让Dave而不是Bill回归,但寻找一个身材高大的男性会让两人都回归。
答案 0 :(得分:1)
这个应该有效:
SELECT P.Name
FROM Person P
JOIN Person_Feature PF
ON P.PersonID = PF.PersonID
JOIN Feature F
ON PF.FeatureID = F.FeatureID
WHERE F.Description IN ('Tall','Black')
GROUP BY P.PersonID
HAVING COUNT(*) = 2
基本上我选择所有具有给定搜索条件并按ID分组的人。然后我用COUNT过滤它们。如果有2个标准,那意味着应该有2行(如果有3个,COUNT(*)
应该是3个)。如果计数小于标准数,那么这意味着该人不符合所有标准(但只有一些标准)。
答案 1 :(得分:0)
尝试这样的事情:
SELECT P.Name
FROM Person P
JOIN Person_Feature PF ON P.PersonID = PF.PersonID
JOIN Feature F ON PF.FeatureID = F.FeatureID
WHERE F.Description in ('Tall','Black');
如果这不能正确理解您的要求,请详细说明,以便我可以增强查询。
答案 2 :(得分:0)
SELECT P.Name
FROM Person P
JOIN Person_Feature PF ON P.PersonID = PF.PersonID
JOIN Feature F ON PF.FeatureID = F.FeatureID
WHERE F.Description IN ('Tall','Black')
GROUP BY P.PersonID
HAVING COUNT(DISTINCT F.Description) = SELECT COUNT(DISTINCT G.Description)
FROM G.Feature WHERE G.Description IN ('Tall','Black');
这不是经过测试的代码。请原谅任何语法错误。将其视为伪代码