回答

收藏

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

技术问答 技术问答 240 人阅读 | 0 人回复 | 2023-09-13

我在MS SQL Server2005年数据库中有两个表,父表和子表,其中父表可能与许多子记录有关。[Child.parent_id]与[parent.id]相关。子表也有[foo]列,我需要把所有的记录带回父表,包括[child.foo]匹配一个到多个参数中的每个参数。例如,我希望所有[child.foo]值为’fizz’和[child.foo]值为’buzz’父记录。我已经尝试了以下查询,但是它的返回记录只匹配一个。
; e! z2 V3 D$ A& \" {6 J9 }SELECT     Parent.IDFROM         Parent INNER JOIN Child ON Parent.ID = Child.parent_idWHERE     (Child.foo = 'fizz')UNION ALLSELECT     Parent_1.IDFROM         Parent AS Parent_1 INNER JOIN Child AS Child_1 ON Parent_1.ID = Child_1.parent_idWHERE     (Child_1.foo = 'buzz            
5 K, i! V' R, t" w; y& W3 ]    解决方案:                                                               
6 E$ K4 \2 b3 X! `7 Z( c7 F+ o% z                                                                这将返回所有[至少]孩子的 fizz” foo和[至少]孩子有 buzz” foo的所有父记录。我认为这是问题中所需要的。
  G( \" ?( s$ `1 j5 K同样,虽然查询可能不是最好的选择,但从某种意义上说,它是通用的,可以与大多数一起使用SQL共同使用不仅适用于支持CTE,更现代的子查询及相关结构SQL实现。
* o  {6 Z3 c; t2 j9 [4 P            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'编辑    :5 g, N1 h# E4 K  w, V: E  a
既然Joel Potter查询已在他的答案中修复,我们可能同意他的方法比上面列出的查询有很多优点(请给他一些  reps)。特别是:
& u( n6 t, {7 T' [& S当我们添加或删除列时foo查询 的目标值结构    不会改变。+ r7 f1 h: {' j. y6 x
查询可能更容易[服务器本身优化]4 k3 y" H0 f0 M8 j- W  ]7 b9 g0 v* Z
查询结构允许它处理过滤器定义的变化。例如,我们可以查询所有子代的父亲,例如,有五个可能值foo中的2个。
以下是Joel这里的查询(稍作修改)显示了如何将其扩展到2个以上foo值。  R& S; M  j8 c+ z/ v
SELECT Parent.IdFROM ParentINNER JOIN Child on Parent.Id = child.parent_idWHERE Child.foo IN ('fizz','buzz')  -- or say,... IN ('fizz','buzz','bang','dong')GROUP BY Parent.IdHAVING COUNT(DISTINCT Child.foo) = 2  -- or 4 ...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则