两张表结构如下;信息表:
ID,Name ...等字段 时间表: ID time date 三个字段 (其中ID 和 time 为关键字)
要求查询到 ID Name Date 等信息
其中日期型的Date 要求是未来距当前系统时间最近的日期
例如:
下表:
ID, Name ID time date
zhang 张山 zhang 1 2008-5-5
li 李四 zhang 2 2008-8-31
zhang 3 2007-9-5
zhang 4 2009-9-10
zhang 5 2010-5-2
li 1 2007-9-5
li 2 2009-9-10
li 3 2010-5-2
要求查询 ID为 li的信息 获得信息如下:
li 李四 2009-9-10其中的 2009-9-10是未来 距今天最近的日期,
我知道一条SQL 语句可以搞定,但我数据库不是我的强项 麻烦高人帮下忙 !!
ID,Name ...等字段 时间表: ID time date 三个字段 (其中ID 和 time 为关键字)
要求查询到 ID Name Date 等信息
其中日期型的Date 要求是未来距当前系统时间最近的日期
例如:
下表:
ID, Name ID time date
zhang 张山 zhang 1 2008-5-5
li 李四 zhang 2 2008-8-31
zhang 3 2007-9-5
zhang 4 2009-9-10
zhang 5 2010-5-2
li 1 2007-9-5
li 2 2009-9-10
li 3 2010-5-2
要求查询 ID为 li的信息 获得信息如下:
li 李四 2009-9-10其中的 2009-9-10是未来 距今天最近的日期,
我知道一条SQL 语句可以搞定,但我数据库不是我的强项 麻烦高人帮下忙 !!
-- Author: liangCK 小梁
-- Date : 2008-11-30 17:23:22
---------------------------------
--> 生成测试数据: @信息表
DECLARE @信息表 TABLE (ID VARCHAR(5),Name VARCHAR(4))
INSERT INTO @信息表
SELECT 'zhang','张山' UNION ALL
SELECT 'li','李四'
--> 生成测试数据: @时间表
DECLARE @时间表 TABLE (ID VARCHAR(5),time INT,date DATETIME)
INSERT INTO @时间表
SELECT 'zhang',1,'2008-5-5' UNION ALL
SELECT 'zhang',2,'2008-8-31' UNION ALL
SELECT 'zhang',3,'2007-9-5' UNION ALL
SELECT 'zhang',4,'2009-9-10' UNION ALL
SELECT 'zhang',5,'2010-5-2' UNION ALL
SELECT 'li',1,'2007-9-5' UNION ALL
SELECT 'li',2,'2009-9-10' UNION ALL
SELECT 'li',3,'2010-5-2'--SQL查询如下:SELECT
A.ID,
A.Name,
B.date
FROM @信息表 AS A
JOIN (
SELECT
ID,
MIN(date) AS date
FROM @时间表
WHERE date>GETDATE()
GROUP BY ID
) AS B
ON A.ID=B.ID/*
ID Name date
----- ---- -----------------------
li 李四 2009-09-10 00:00:00.000
zhang 张山 2009-09-10 00:00:00.000(2 行受影响)*/
-- Author: liangCK 小梁
-- Date : 2008-11-30 17:23:22
---------------------------------
--> 生成测试数据: @信息表
DECLARE @信息表 TABLE (ID VARCHAR(5),Name VARCHAR(4))
INSERT INTO @信息表
SELECT 'zhang','张山' UNION ALL
SELECT 'li','李四'
--> 生成测试数据: @时间表
DECLARE @时间表 TABLE (ID VARCHAR(5),time INT,date DATETIME)
INSERT INTO @时间表
SELECT 'zhang',1,'2008-5-5' UNION ALL
SELECT 'zhang',2,'2008-8-31' UNION ALL
SELECT 'zhang',3,'2007-9-5' UNION ALL
SELECT 'zhang',4,'2009-9-10' UNION ALL
SELECT 'zhang',5,'2010-5-2' UNION ALL
SELECT 'li',1,'2007-9-5' UNION ALL
SELECT 'li',2,'2009-9-10' UNION ALL
SELECT 'li',3,'2010-5-2'--SQL查询如下:SELECT
A.ID,
A.Name,
B.date
FROM @信息表 AS A
JOIN (
SELECT
ID,
MIN(date) AS date
FROM @时间表
WHERE date>GETDATE()
GROUP BY ID
) AS B
ON A.ID=B.ID
WHERE A.ID='li'/*
ID Name date
----- ---- -----------------------
li 李四 2009-09-10 00:00:00.000(1 行受影响)*/
from 信息表 a,时间表 b
where a.id=b.id
and b.[date]>getdate()
and not exists (
select 1 from 时间表
where id=b.id
and [date]>getdate()
and [date]<b.[date]
)
a.ID,
a.Name,
b.date
from 信息表 a,时间表 b
where a.ID=b.ID
and datediff(day,b.[date],getdate())>0
and not exists(select * from 时间表 where id=b.id and [time] < b.[date])
from 信息表 a,时间表 b
where a.id=b.id
and b.[date]>getdate()
and b.[date] = (
select top 1 [date]
from 时间表
where id=b.id
and [date]>getdate()
order by [date]
)
c++中的查询语句 ,不知道为什么不行 数据库ACCESS
strSQL.Format("select bargain.BargainID,bargain.BargainName,bargain.EndorseDate,bargain.EaturityDate,bargain.DocPath,B.PayDate from bargain left join (select BargainID,min(PayDate) from PayTb where PayDate>#%s# and BargainID='%s' group by BargainID) as B on(bargain.BargainID=B.BargainID)",strTime,str);
我感觉我写的这条语句没问题啊, 麻烦大家看下 strSQL.Format("select A.BargainID,A.BargainName,A.EndorseDate,A.EaturityDate,A.DocPath,B.PayDate
from bargain AS A left join
(select BargainID,min(PayDate) from PayTb where PayDate>#%s# and BargainID='%s' group by BargainID) AS B on (A.BargainID=B.BargainID)",strTime,str);