Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669879
  • 博文数量: 96
  • 博客积分: 2005
  • 博客等级: 上尉
  • 技术积分: 1061
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 13:59
文章分类

全部博文(96)

文章存档

2013年(11)

2012年(30)

2011年(55)

分类: Mysql/postgreSQL

2011-11-03 17:40:26

表结构以及数据如下:
CREATE TABLE 表 
(ID int, 日期 varchar(11), 单据 char(3))

INSERT INTO 表 (ID , 日期 , 单据 ) VALUES ( 1 , '2004-08-02' , '001' );
INSERT INTO 表 (ID , 日期 , 单据 ) VALUES ( 2 , '2004-09-02' , '001' );
INSERT INTO 表 (ID , 日期 , 单据 ) VALUES ( 3 , '2004-10-02' , '002' );
INSERT INTO 表 (ID , 日期 , 单据 ) VALUES ( 4 , '2004-09-02' , '002' );

要求:设计一个查询,返回结果如下:

ID 日期 单据
---------- ----------- ---
1 2004-08-02 001
4 2004-09-02 002

即对于每个单据号,返回日期最小的行。

--解答:
--相关子查询
select a.* from 表 a
where 日期=
(select min(日期) from 表 where 单据=a.单据)

--用JOIN的连接
select a.* from 表 a,
(select min(日期) 日期,单据 from 表 group by 单据) b
where a.单据=b.单据 and a.日期=b.日期

--不用JOIN的连接
select a.* from 表 a JOIN 
(select min(日期) 日期,单据 from 表 group by 单据) b
ON a.单据=b.单据 and a.日期=b.日期

--用谓词Exists
select * from 表 a
where not exists(select 1 from 表 where 单据=a.单据 and 日期

--借助函数concat
select * from 表 where concat(日期,单据) in (select concat(min(日期),单据) as data from 表 group by 单据);
阅读(1581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~