这是最后一个问题的延续找到匹配行的组 , X$ x+ {+ _% ^; T0 t( ]我有一张桌子,里面有人和他们拥有的1 s8 s( W5 r, ~
------- ------- | Name | Model | ------- ------- | Bob | Camry || Bob | Civic || Bob | Prius || John | Camry || John | Civic || John | Prius || Kevin | Civic || Kevin | Focus || Mark | Civic || Lisa | Focus || Lisa | Civic | ------- ------- 这个查询为我提供了与我拥有完全相同的汽车Lisa以及Lisa本人,这很好。 1 h& j# n2 j9 ^* e- S;with cte as ( select * ,cnt = count(*) over (partition by name) from t),matches as ( select x2.name from cte as x inner join cte as x2 on x.model = x2.model and x.cnt = x2.cnt and x.name = 'Lisa' group by x2.name,x.cnt having count(*) = x.cnt)select t.* from t inner join matches m on t.name = m.name结果:, V% V/ k+ j% [
------- ------- | name | model | ------- ------- | Lisa | Civic || Lisa | Focus || Kevin | Civic || Kevin | Focus | ------- ------- 如果我想找到所有拥有相同汽车的人Bob,请重新操作查询,结果应该是我John。- x2 q' x2 |: J- {8 n
现在,我有一个Java名称列表,对于每个名称,我运行此查询。真的很慢。无论如何,你能找到所有拥有相同汽车的人,并在单个数据库调用中将结果分成小组吗?# | S" X9 k/ [% {, F8 E1 d5 U! A ~
例如,使用第一个表。我可以操作名称分组查询。请注意如何Mark消失了,因为他没有和别人完全一样的车,只有一个子集。 ; f# x# X; y6 |) ] ------- ------- ------- | Name | Model | Group | ------- ------- ------- | Bob | Camry | 1 || Bob | Civic | 1 || Bob | Prius | 1 || John | Camry | 1 || John | Civic | 1 || John | Prius | 1 || Kevin | Civic | 2 || Kevin | Focus | 2 || Lisa | Focus | 2 || Lisa | Civic | 2 | ------- ------- ------- 这个结果集也很好,我只需要知道谁属于哪个组,以后就可以拿回他们的车了。 \; `$ c5 n$ j ------- ------- | Name | Group | ------- ------- | Bob | 1 || John | 1 || Kevin | 2 || Lisa | 2 | ------- ------- 我需要以某种方式通过名称列表,找到所有拥有相同汽车的人,然后将其全部合并到结果集中。 1 r& K- }' o# ?# l% ] 5 B7 M; i3 y d6 a 解决方案: - i6 \1 g- S2 c& x2 p5 @* e# H7 u' X
您可以以两种方式执行此操作。一种方法是复杂的连接。另一种方法是捷径。只需将汽车汇总成一个字符串,并比较字符串。# ~- `6 v4 U4 L- Z) \4 J
with nc as ( select n.name, stuff( (select , t.model from t where t.name = n.name order by t.model for xml path1、1、1、1as cars from (select distinct name from t) n )select nc.name,nc.cars,dense_rank() over (order by nc.cars)from ncorder by nc.cars;这将创建一个列表,包括名称和汽车列表,用逗号分隔列表。如果您愿意,您可以添加原始列表以获得原始行。