Sql server 是否可以编写一个查询来查找没有联接和ORDER BY的最大记录数?
更新-问题 除了使用自联接,是否有一种更紧凑的方法来编写从表中选择最多记录的查询 例如,事件表可能具有以下架构:Sql server 是否可以编写一个查询来查找没有联接和ORDER BY的最大记录数?,sql-server,tsql,Sql Server,Tsql,更新-问题 除了使用自联接,是否有一种更紧凑的方法来编写从表中选择最多记录的查询 例如,事件表可能具有以下架构: EventID | EventType | Timestamp | Description -----------+-----------+-----------+-------------- INT | VARCHAR | INT | VARCHAR 并且可能包含每种类型事件的多条记录。比如说: 1 | A |
EventID | EventType | Timestamp | Description
-----------+-----------+-----------+--------------
INT | VARCHAR | INT | VARCHAR
并且可能包含每种类型事件的多条记录。比如说:
1 | A | 100000 | 'First Event'
2 | A | 100005 | 'Second Event'
3 | B | 100009 | 'Third Event'
4 | A | 100009 | 'Fourth Event'
5 | B | 100010 | 'Fifth Event'
6 | B | 100030 | 'Sixth Event'
7 | A | 100030 | ' ... '
8 | C | 100030 | ' ... '
9 | C | 100050 | ' ... '
比如说,我想知道每种类型的最新事件是什么,即事件6、7和9。然后我必须编写一个如下所示的查询:
SELECT EventID
, EventType
, Timestamp
, Description
FROM EventsTable T
INNER JOIN (SELECT EventType
, MAX(Timestamp)
FROM EventsTable TInner
GROUP BY EventType) TSelf
ON T.Timestamp = TSelf.Timestamp
AND T.EventType = TSelf.EventType
因此,问题归结为:是否有一种更简洁的方式来表达相同的查询,理想情况下不必求助于连接
SELECT EventID, EventType, Timestamp, Description
FROM EventsTable T
WHERE T.EventType = 'B'
ORDER BY Timestamp
LIMIT 1
应该这样做(对于支持LIMIT的DBMS)
没有意识到您只需要返回一行。使用公共表表达式来实现所需的结果。简单而干净
试试这个
SELECT EventID, EventType, Timestamp, Description
FROM EventsTable
WHERE EventType = 'B' AND
Timestamp = (SELECT max(Timestamp) FROM EventsTable WHERE EventType = 'B');
如果您不想使用order by,请使用以下命令:
SELECT * FROM EventsTable WHERE EventType = 'B' AND
Timestamp = (SELECT Max(Timestamp) FROM EventsTable WHERE EventType = 'B');
如果“订购方式”正常:
Mysql:
SELECT * FROM EventsTable WHERE EventType = 'B' ORDER BY Timestamp DESC LIMIT 1;
Sql Server:
SELECT TOP 1 * FROM EventsTable WHERE EventType = 'B' ORDER BY Timestamp DESC
请参见。如果DBMS支持限制,则回答正确。由于问题刚被标记为“sql”,您可能想在答案中添加一个限定符。在没有说明RDBMS的情况下,不要问性能问题。这是毫无意义的。SQL是声明性的。它的优化方式取决于实施情况。例如,SQL Server可以使用,并且执行计划根本不包含自联接。@MartinSmith-这一点很好。更新了问题标记:SQL Server中该查询的实际执行计划是什么。您可以根据您的问题在聚合上进行自联接<代码>交叉应用(选择TOP 1或使用
行数
这是我的堆栈溢出,但现在已经完成。还有其他事情要做!这并不像我给出的示例中的查询那样紧凑..您正在使用特征替换查询+子查询,尽管其中一种方法没有连接。:D
SELECT TOP 1 * FROM EventsTable WHERE EventType = 'B' ORDER BY Timestamp DESC