当前位置: 首页 > 面试题库 >

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

芮明知
2023-03-14
问题内容

我有一张桌子,里面有人和他们拥有的汽车

+-------+-------+
| 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 |
+-------+-------+

我需要以某种方式遍历一个名称列表,找到所有拥有相同汽车的人,然后将其全部合并到一个结果集中。


问题答案:

您可以通过两种方式执行此操作。一种方法是进行复杂的联接。另一种方法是捷径。只需将汽车汇总为一个字符串并比较字符串即可。

with nc as (
      select n.name,
             stuff( (select ',' + t.model
                     from t
                     where t.name = n.name
                     order by t.model
                     for xml path ('')
                    ), 1, 1, '') as cars
      from (select distinct name from t) n
     )
select nc.name, nc.cars, dense_rank() over (order by nc.cars)
from nc
order by nc.cars;

这将创建一个列表,其中包含名称和汽车列表,以逗号分隔列表。如果愿意,可以加入原始表以获取原始行。



 类似资料:
  • 问题内容: 通过将用户的IP,失败的尝试次数和最后的尝试时间记录到名为的MySQL数据库表中,我有一种简单的登录系统保护机制。但是,当我尝试使用以下代码在数据库中插入新条目时,execute()函数将返回false并无法执行。 代码如下: 我是php和MySQL的新手,通过研究,我发现SQL语法显然需要在查询的VALUE部分的字段周围加上引号,例如: 但是我在这里发现它实际上使查询停止工作(仍然尝

  • 我有一个LegacyAcCountDto,我需要从两个不同的来源建立一个列表。一个是本地JPA存储库,另一个是Web服务调用。Web服务版本具有JPA数据源不可用的帐户状态。我需要并行执行两个调用,当它们都完成时,我需要找到Web服务列表的legacyId,并用从Web服务中提取的帐户状态填充列表。整个想法是返回一个包含完整DTO的列表。我不需要把它保存回网络服务或JPA回购 DTO: merge

  • 问题内容: 我正在我的VirtualBoxed Ubuntu 11.4上测试此Go代码 Ubuntu可以访问我所有的4个内核。我通过同时运行几个可执行文件和系统监视器来检查这一点。但是,当我尝试运行此代码时,它仅使用一个内核,并且没有从并行处理中获得任何收益。 我做错了什么? 问题答案: 您可能需要查看Go FAQ 的Concurrency部分,特别是以下两个问题,并确定哪个(如果不是两个)适用于

  • 最近,我们正在为我们的应用程序解决一个性能问题,该代码最初是基于Corda教程代码的M13版本构建的,我们遵循了Corda的版本,现在更新为V2.0。业务很简单,甲方以表单的形式上传一份包含一些元数据的合同文档,然后将此事务发送给乙方,我们在验证功能中定义了一些简单的条件,因此,通常事务将在没有任何手动操作的情况下完成。但如果我们在本地环境中这样做,这个过程大约需要3秒钟(一个2.9M附件),但当

  • 当我使用预准备语句异步执行多个语句时,我得到带有损坏数据的JSON。键和值完全损坏了。 首先,当我使用自定义脚本对我们的项目执行压力测试时,我遇到了这个问题。我们使用DataStax C驱动程序并执行来自不同光纤的语句。 然后,我试图隔离这个问题,并编写了一个简单的C#程序,它在一个循环中启动多个Task。每个任务都使用一次创建的prepared语句从基中读取数据。对于某些行,结果完全混乱,例如:

  • 问题内容: 说我想做,如何在同一个mysql_query()中做它们? 编辑: 由于这个问题有很多看法,我想指出,自PHP 5.5起,其他功能现在已被弃用,不应使用。 问题答案: 我从来没有尝试过,但是我认为您可以使用mysqli :: multi_query 。拒绝多条语句的好处之一是,它可以立即排除一些更常见的SQL注入攻击,例如添加一条语句。因此,您可能需要注意多个语句。