SQL查询以获取具有子记录列表的父表的记录

标签 sql sql-server-2005 hierarchical-data

我在 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 的 child 和 [至少] 一个带有 'buzz' foo 的 child 。这是我认为问题所必需的。

此外,虽然可能不是最优的,但从某种意义上说,此查询是通用的,它将适用于大多数 SQL 实现,而不仅仅是支持 CTE、子查询和相关构造的更现代的实现。

   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'

编辑 :
既然 Joel Potter 已经在他的回答中解决了这个问题,我们可能同意他的方法比上面列出的查询有几个优点(请给他几个 + 代表)。特别是:
  • 当我们添加或删除列 foo 的目标值时,查询的结构不会改变。
  • 查询可能更容易优化 [由服务器本身]
  • 查询的结构允许它处理过滤器定义的变化。例如,我们可以查询所有有 child 的 parent ,例如 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 ...  
    

    关于SQL查询以获取具有子记录列表的父表的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165119/

    相关文章:

    sql - 找不到对称 key '' ,因为它不存在或您没有权限

    tsql - 在自联接表上展平层次结构

    mysql - 有多少个 "entities"在这个层次结构之下。嵌套集/邻接(英国境内有多少个 POI)

    android - 我的sqlite查询错了吗?

    php - 使用 MYSQL 命令行进行 SQL 导入/导出

    php - 未从 Laravel 中的原始查询返回任何结果

    MySQL - 防止一行引用自身

    sql-server-2005 - SQL 查询 : Hierarchical Coalesce

    sql - 如何提高数据库的性能?

    sql - 如何更新嵌套集树结构?