SQL select -one to many joins 希望有很多

Posted

技术标签:

【中文标题】SQL select -one to many joins 希望有很多【英文标题】:SQL select -one to many joins want to have the manys 【发布时间】:2013-08-15 14:21:37 【问题描述】:

我有两个表,TBL_PARENT (parentID, ParentName) 和 TBL_CHILDREN (ParentID,Child_Name) 一个 Parent 可以有 0 到多个孩子

我想要的是一个查询,以在每个父母的单行中为我提供父母及其子女的列表。

例如

Parent1 John,Mary

Parent2 jane,steve,jana

而行数是父母的总数

【问题讨论】:

这是“右外连接”的候选人吗? 我尝试了左连接,但它给出了重复项。就像我做 SELECT P.PARENTID, C.NAME FROM TBL_PARENT P LEFT OUTER JOIN TBL_CHILDREN C 在这个论坛上问过很多次。搜索“sql stuff xml”***.com/search?q=sql+stuff+xml Declan_K 找不到类似的 这是您需要的答案。这不是问题的公认答案,但它是正确的答案。 ***.com/a/177153/2324286 【参考方案1】:

试试这个查询: 我已经创建了 3 个表,其中 2 个已经在您的数据库上创建了 #parant,#ch 第三个是放置结果的临时表。

create table #parant (id int , name varchar(10))
create table #ch (id int , name varchar(10), pid int)

insert into #parant select 1,'PA'
insert into #parant select 2,'PB'
insert into #parant select 3,'PC'

insert into #ch select 1,'Ca',1
insert into #ch select 1,'Cb',1
insert into #ch select 1,'Cc',1
insert into #ch select 1,'Cd',3
insert into #ch select 1,'Cf',3
insert into #ch select 1,'Ch',1




create table #testTable (id int, name varchar(10),chid int, chname varchar(10), cpid int)

insert into #testTable 
select x.id , x.name ,isnull( y.id ,0), isnull(y.name,'') ,isnull(y.pid ,0)
from #parant as x
left outer join #ch as y
on x .id = y .pid 

SELECT t.ID, t.name , STUFF(
(SELECT ',' + s.chname
FROM #TestTable s
WHERE s.ID = t.ID
FOR XML PATH('')),1,1,'') AS CSV
FROM #TestTable AS t
GROUP BY t.ID, t.name
GO


drop table #testTable 
drop table #ch 
drop table #parant 

对于上述数据,我得到以下结果

1 PA Ca,Cb,Cc,Ch 2 PB 3 PC Cd,Cf

【讨论】:

wala rawashdeh,感谢您的回答,它完美无缺。下一个问题是如果我有第三个表 FRIEND 并且想在同一结果集中显示父级的朋友(一个父级可以有 0 到多个朋友),我该如何修改语法?谢谢【参考方案2】:
SELECT COUNT(P.parentID),
P.ParentName, 
C.Child_Name 
FROM TBL_PARENT as P
INNER JOIN TBL_CHILDREN as C  
WHERE P.parentID == c.ParentID
GROUP BY P.ParentName;

P.parentID == c.ParentID 行正在执行 Join,count(P.parentID) 行正在计算所有父母和GROUP BY P.ParentName 行按父项的名称对所有行进行分组,因此您可以显示每个父项的所有子项。

【讨论】:

以上是关于SQL select -one to many joins 希望有很多的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle SQL中计算工作日(无函数或过程)

ssh老项目回顾-2

如何编写这个 many_to_many ActiveRecord 查询?

Ecto:在 many_to_many 查询中包含连接模式字段

grails many_to_many 自定义映射表

Laravel whereHas on Many-to-Many 关系