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