我在 MS SQL Server 2005 数据库中有两个表:父表和子表,其中父表可能与许多子记录相关。 [Child.parent_id] 与 [parent.id] 相关。子表也有列 [foo] 我需要带回父表中的所有记录,其中 [child.foo] 与一对多参数中的每个参数匹配。例如,我希望所有父记录的 [child.foo] 值为“fizz”,[child.foo] 值为“buzz”。
我尝试了以下查询,但它返回的记录仅与一条匹配。
SELECT Parent.ID
FROM Parent
INNER JOIN Child ON Parent.ID = Child.parent_id
WHERE (Child.foo = 'fizz')
UNION ALL
SELECT Parent_1.ID
FROM Parent AS Parent_1
INNER JOIN Child AS Child_1 ON Parent_1.ID = Child_1.parent_id
WHERE (Child_1.foo = 'buzz')
这将返回所有[至少]一个具有“fizz”foo 的子级和[至少]一个具有“buzz”foo 的子级的父记录。这是我认为问题中所需要的。
此外,虽然可能不是最优的,但从某种意义上说,该查询是通用的,它适用于大多数 SQL 实现,而不仅仅是支持 CTE、子查询和相关构造的更现代的 SQL 实现。
SELECT DISTINCT Parent.ID
FROM Parent
JOIN Child C1 ON Parent.ID = C1.parent_Id
JOIN Child C2 ON Parent.ID = C2.parent_id
WHERE C1.foo = 'fizz'
AND C2.foo = 'buzz'
Edit:
既然 Joel Potter 已经在他的答案中修复了这个查询,我们可能同意他的方法比上面列出的查询有几个优点(请给他一些+代表)。尤其:
- the 结构当我们添加或删除列 foo 的目标值时,查询的内容不会改变。
- 查询可能更容易优化[由服务器本身]
- 查询的结构允许它处理过滤器定义的变化。例如,我们可以查询所有有孩子的父母,例如 foo 的 5 个可能值中存在 2 个。
以下是 Joel 的查询,稍作修改,以显示如何将其扩展为超过 2 个 foo 值。
SELECT Parent.Id
FROM Parent
INNER JOIN Child on Parent.Id = child.parent_id
WHERE Child.foo IN ('fizz', 'buzz') -- or say, ... IN ('fizz', 'buzz', 'bang', 'dong')
GROUP BY Parent.Id
HAVING COUNT(DISTINCT Child.foo) = 2 -- or 4 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)