一题四解:SQL经典面试题

本文介绍了一种SQL查询技巧,通过使用子查询、JOIN连接及Exists谓词等方法,实现了针对特定需求的数据检索,即找出每个单据号对应的最早日期记录。

朱二(2007.1 转载请注明作者)

表结构以及数据如下:

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 日期<a.日期)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值