【发布时间】:2010-03-06 18:16:24
【问题描述】:
如果我有一个包含 id、name、score、date 列的表
我想运行一个 sql 查询来获取 id = 2 在数据集中具有最早日期的记录。
您可以在查询中执行此操作,还是需要在事后循环?
我想获取该记录的所有字段..
【问题讨论】:
标签: sql sql-server
如果我有一个包含 id、name、score、date 列的表
我想运行一个 sql 查询来获取 id = 2 在数据集中具有最早日期的记录。
您可以在查询中执行此操作,还是需要在事后循环?
我想获取该记录的所有字段..
【问题讨论】:
标签: sql sql-server
如果你只想要日期:
SELECT MIN(date) as EarliestDate
FROM YourTable
WHERE id = 2
如果您想要所有信息:
SELECT TOP 1 id, name, score, date
FROM YourTable
WHERE id = 2
ORDER BY Date
尽可能避免循环。循环通常会导致游标,而游标几乎从不需要,而且通常效率很低。
【讨论】:
SELECT TOP 1 ID, Name, Score, [Date]
FROM myTable
WHERE ID = 2
Order BY [Date]
【讨论】:
虽然使用 TOP 或子查询都可以,但我会将问题分解为几个步骤:
查找目标记录
SELECT MIN( date ) AS date, id
FROM myTable
WHERE id = 2
GROUP BY id
加入获取其他领域
SELECT mt.id, mt.name, mt.score, mt.date
FROM myTable mt
INNER JOIN
(
SELECT MIN( date ) AS date, id
FROM myTable
WHERE id = 2
GROUP BY id
) x ON x.date = mt.date AND x.id = mt.id
虽然这个使用派生表的解决方案更长,但它是:
由于部分查询可以独立运行,因此更容易测试。
它是自我记录的,因为查询直接反映了需求 即派生表列出了id = 2且日期最早的行。
它是可扩展的,就好像需要另一个条件一样,这可以很容易地添加到派生表中。
【讨论】:
试试
select * from dataset
where id = 2
order by date limit 1
我做sql已经有一段时间了,所以这可能需要一些调整。
【讨论】:
使用“limit”和“top”不适用于所有 SQL 服务器(例如 Oracle)。 你可以在纯sql中尝试更复杂的查询:
select mt1.id, mt1."name", mt1.score, mt1."date" from mytable mt1
where mt1.id=2
and mt1."date"= (select min(mt2."date") from mytable mt2 where mt2.id=2)
【讨论】: