这是前一个问题的延续:Find groups with matching rows如何执行语句的每一行,并返回整个结果
我有一个包含人,他们拥有
+-------+-------+
| 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自己,这很好。
;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
结果:
+-------+-------+
| name | model |
+-------+-------+
| Lisa | Civic |
| Lisa | Focus |
| Kevin | Civic |
| Kevin | Focus |
+-------+-------+
如果我想找出谁拥有相同的车作为Bob
所有的人,我重新运行查询和结果应该给我John
。
现在,我有一个在Java名称列表,并为每个名称,我运行此查询。它真的很慢。无论如何,要找到所有拥有相同汽车的人,并在单个数据库调用中将结果划分为多个组?
例如,使用第一个表。我可以运行一个查询来分组名称。注意Mark
已经消失了,因为他不像其他人一样拥有完全相同的汽车,而只是一个子集。
+-------+-------+-------+
| 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 |
+-------+-------+-------+
这个结果集也很好,我只需要知道谁属于哪个组,我可以晚点取车。
+-------+-------+
| Name | Group |
+-------+-------+
| Bob | 1 |
| John | 1 |
| Kevin | 2 |
| Lisa | 2 |
+-------+-------+
我需要以某种方式遍历名称的列表,找到谁拥有相同的车所有的人,然后将其全部合并成一个结果集。
您的回答和@SqlZim返回了相同的结果,除了您的查询有一个更简单的执行计划,所以我只是接受了这一点。 –