表结构以及数据如下:
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 单据);
阅读(1586) | 评论(0) | 转发(0) |