回答

收藏

如何为每一行执行语句并返回整个结果

技术问答 技术问答 200 人阅读 | 0 人回复 | 2023-09-12

这是最后一个问题的延续找到匹配行的组
, 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;这将创建一个列表,包括名称和汽车列表,用逗号分隔列表。如果您愿意,您可以添加原始列表以获得原始行。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则