`

查询出多条记录取一条

阅读更多
举一个简单的例子(查询出多个记录任意取一条):
现有表aaa,
A     B
aaa   1
aaa   2
bbb   3
bbb   4
bbb   5
bbb   6
ccc   7
ccc   8

执行select t.* from aaa t where t.b = (select b from aaa where a = t.a and rownum<2)的结果如下:
A    B
aaa  1
bbb  3
ccc  6

下面有好多方法,来自一位高手列举的:
/*  数据如下:  name val memo  a    2   a2(a的第二个值)  a    1   a1--a的第一个值  a    3   a3:a的第三个值  b    1   b1--b的第一个值  b    3   b3:b的第三个值  b    2   b2b2b2b2  b    4   b4b4  b    5   b5b5b5b5b5  */  --创建表并插入数据:  create table tb(name varchar(10),val int,memo varchar(20))  insert into tb values('a',    2,   'a2(a的第二个值)')  insert into tb values('a',    1,   'a1--a的第一个值')  insert into tb values('a',    3,   'a3:a的第三个值')  insert into tb values('b',    1,   'b1--b的第一个值')  insert into tb values('b',    3,   'b3:b的第三个值')  insert into tb values('b',    2,   'b2b2b2b2')  insert into tb values('b',    4,   'b4b4')  insert into tb values('b',    5,   'b5b5b5b5b5')  go    --一、按name分组取val最大的值所在行的数据。  --方法1:  select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name  --方法2:  select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)  --方法3:  select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name  --方法4:  select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name  --方法5  select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name  /*  name       val         memo                   ---------- ----------- --------------------   a          3           a3:a的第三个值  b          5           b5b5b5b5b5  */    --二、按name分组取val最小的值所在行的数据。  --方法1:  select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name  --方法2:  select a.* from tb a where not exists(select 1 from tb where name = a.name and val  < a.val)  --方法3:  select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name  --方法4:  select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name  --方法5  select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val  < a.val) order by a.name  /*  name       val         memo                   ---------- ----------- --------------------   a          1           a1--a的第一个值  b          1           b1--b的第一个值  */    --三、按name分组取第一次出现的行所在的数据。  select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name  /*  name       val         memo                   ---------- ----------- --------------------   a          2           a2(a的第二个值)  b          1           b1--b的第一个值  */    --四、按name分组随机取一条数据。  select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name  /*  name       val         memo                   ---------- ----------- --------------------   a          1           a1--a的第一个值  b          5           b5b5b5b5b5  */    --五、按name分组取最小的两个(N个)val  select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val  < a.val ) order by a.name,a.val  select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val  select a.* from tb a where exists (select count(*) from tb where name = a.name and val  < a.val having Count(*)  < 2) order by a.name,a.val  /*  name       val         memo                   ---------- ----------- --------------------   a          1           a1--a的第一个值  a          2           a2(a的第二个值)  b          1           b1--b的第一个值  b          2           b2b2b2b2  */    --六、按name分组取最大的两个(N个)val  select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val  select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val  select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*)  < 2) order by a.name , a.val  /*  name       val         memo                   ---------- ----------- --------------------   a          2           a2(a的第二个值)  a          3           a3:a的第三个值  b          4           b4b4  b          5           b5b5b5b5b5  */  --七,如果整行数据有重复,所有的列都相同。  /*  数据如下:  name val memo  a    2   a2(a的第二个值)  a    1   a1--a的第一个值  a    1   a1--a的第一个值  a    3   a3:a的第三个值  a    3   a3:a的第三个值  b    1   b1--b的第一个值  b    3   b3:b的第三个值  b    2   b2b2b2b2  b    4   b4b4  b    5   b5b5b5b5b5  */  --在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。  --创建表并插入数据:  create table tb(name varchar(10),val int,memo varchar(20))  insert into tb values('a',    2,   'a2(a的第二个值)')  insert into tb values('a',    1,   'a1--a的第一个值')  insert into tb values('a',    1,   'a1--a的第一个值')  insert into tb values('a',    3,   'a3:a的第三个值')  insert into tb values('a',    3,   'a3:a的第三个值')  insert into tb values('b',    1,   'b1--b的第一个值')  insert into tb values('b',    3,   'b3:b的第三个值')  insert into tb values('b',    2,   'b2b2b2b2')  insert into tb values('b',    4,   'b4b4')  insert into tb values('b',    5,   'b5b5b5b5b5')  go    select * , px = identity(int,1,1) into tmp from tb    select m.name,m.val,m.memo from  (    select t.* from tmp t where val = (select min(val) from tmp where name = t.name)  ) m where px = (select min(px) from  (    select t.* from tmp t where val = (select min(val) from tmp where name = t.name)  ) n where n.name = m.name)    drop table tb,tmp    /*  name       val         memo  ---------- ----------- --------------------  a          1           a1--a的第一个值  b          1           b1--b的第一个值    (2 行受影响)  */  --在sql server 2005中可以使用row_number函数,不需要使用临时表。  --创建表并插入数据:  create table tb(name varchar(10),val int,memo varchar(20))  insert into tb values('a',    2,   'a2(a的第二个值)')  insert into tb values('a',    1,   'a1--a的第一个值')  insert into tb values('a',    1,   'a1--a的第一个值')  insert into tb values('a',    3,   'a3:a的第三个值')  insert into tb values('a',    3,   'a3:a的第三个值')  insert into tb values('b',    1,   'b1--b的第一个值')  insert into tb values('b',    3,   'b3:b的第三个值')  insert into tb values('b',    2,   'b2b2b2b2')  insert into tb values('b',    4,   'b4b4')  insert into tb values('b',    5,   'b5b5b5b5b5')  go    select m.name,m.val,m.memo from  (    select * , px = row_number() over(order by name , val) from tb  ) m where px = (select min(px) from  (    select * , px = row_number() over(order by name , val) from tb  ) n where n.name = m.name)    drop table tb    /*  name       val         memo  ---------- ----------- --------------------  a          1           a1--a的第一个值  b          1           b1--b的第一个值    (2 行受影响)  */ 
分享到:
评论

相关推荐

    Oracle左连接返回多条记录中一条记录的查询语句

    Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录

    MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 ...

    MongoDB聚合分组取第一条记录的案例与实现方法

    2. **排序并选取第一条**:使用 `$sort` 阶段按 `createTime` 字段降序排列,然后用 `$limit` 阶段限制返回一条记录。 完整的聚合管道可能看起来像这样: ```javascript db.mt_resources_access_log20190122....

    查询前几条记录

    "查询前几条记录"这个主题聚焦于如何从数据库表中提取出最早添加或者最相关的若干条数据。这在很多场景下都非常有用,例如展示最新的新闻、加载用户最近的操作记录等。 在SQL语言中,有一个非常常见的方法来实现这...

    Excel公式提取每人最新一条记录.xls

    Lookup + max 提取每个项目的最新一条记录 例如:查询每个商品的最新价格信息及其他信息 查询每个人的最后一次消费信息

    oracel重复记录只保留一条

    oracel重复记录只保留一条,提供sql语句与存储过程2种处理方式

    Delphi如何一次删除dbgrid多条记录的例子.rar

    Delphi演示如何一次删除网格数据表dbgrid中的多条记录,小技巧不过挺实用,希望对大家的Delphi编程有所帮助。以下是实现一次删除多条记录的相关代码供参考:  if DBGrid1.SelectedRows.Count &gt;1 then s:= '真的要...

    Oracle多行记录合并

    在Oracle数据库中,多行记录的合并通常是为了将相同字段的多行数据整合成一行,以便于数据分析或者简化展示。这种操作在报表制作、数据整理等场景中非常常见。本篇文章将详细介绍Oracle中实现多行记录合并的几种方法...

    用一条语句随机抽取多条记录

    在SQL SERVRE中用以下语句可随机抽出多条记录:&lt;BR&gt;select top 13 * from table order by newid() &lt;P&gt;&lt;P&gt;但在Access中却没有newid()这个函数,那能不能用一句语句随机抽出多条记录呢?我们的xuewuyuan版主说:当然...

    SQL中遇到多条相同内容只取一条的最简单实现方法

    在SQL查询中,有时我们需要处理重复的数据,特别是当表中存在多条内容几乎相同但有细微差异的记录时。这种情况通常发生在数据导入错误或者业务逻辑导致的冗余数据上。本文将详细介绍如何在SQL中以最简单的方式选取...

    重复记录查询处理

    删除重复记录一般遵循的原则是:保留每组重复记录中的某一条记录(通常是第一条),其余的进行删除。 ##### 1. 单一字段的重复记录删除 对于单一字段(如`peopleId`)的重复记录删除,可以通过以下步骤实现: ```...

    SQLServer中如何将一个字段的多个记录值合在一行显示

    SQLServer 中将一个字段的多个记录值合并到一行显示的实现方法 SQL Server 是一种关系型数据库管理系统,具有强大的数据处理能力和存储能力。在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以...

    MySQL查询把多列返回结果集拼装成一个字段

    mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...

    ACCESS数据库多表关联查询例程

    2. 一对多关联:一个表的记录可以与另一个表的多个记录相关联。例如,部门表与员工表,一个部门可以有多名员工。 3. 多对多关联:两个表的记录都可以与其他表的多个记录相关联。例如,员工表与项目表,一个员工可以...

    sqlserver中重复数据值只取一条的sql语句

    当数据库表中的某些列有重复的值时,我们可能需要仅选取其中的一条记录,例如,选择每组重复数据的第一条或者最后一条。题目中提到的SQL语句就是解决这类问题的一个示例。 首先,我们创建一个名为`TestData`的数据...

    获取MySQL的表中每个userid最后一条记录的方法

    总结来说,通过`GROUP BY`,`GROUP_CONCAT`和`SUBSTRING_INDEX`的组合,我们可以有效地在MySQL中获取每个`userid`的最后一条记录。这种技巧在日志分析、活动追踪或其他需要获取最新状态的场景中非常实用。了解并掌握...

    Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

    在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...

Global site tag (gtag.js) - Google Analytics