Sql 让子查询返回一行而不是一列
我有一个疑问:Sql 让子查询返回一行而不是一列,sql,Sql,我有一个疑问: SELECT [Address]=e.Address, [LastEmail] = ( SELECT TOP 1 [Email] FROM Email innerE WHERE e.UserID = innerE.UserID AND innerE.Contact = @emailId AND (IsSent is null OR isSent = 0)
SELECT
[Address]=e.Address,
[LastEmail] =
(
SELECT TOP 1 [Email]
FROM Email innerE
WHERE e.UserID = innerE.UserID
AND innerE.Contact = @emailId
AND (IsSent is null OR isSent = 0)
ORDER BY Timestamp DESC
)
FROM Emails e
这很好,但现在,我意识到我想得到包含最后一个电子邮件列的整行,如果可能的话,有什么办法吗?您可以这样做:
;WITH LastEmails
AS
(
SELECT *,
ROW_NUMBER() OVER(ORDER BY Timestamp DESC) rownum
FROM Emails
WHERE Contact = @emailId
AND (IsSent is null OR isSent = 0)
)
SELECT * FROM LastEmails
WHERE rownum = 1;
如果您的DBMS支持它,您可以使用它(我认为它是这样的,因为它看起来像SQL Server语法)
这类似于相关子查询,但允许多行多列。我使用了这个答案的组合,并提供了我所需要的。我也使用了rank()代替row_number()。
SELECT [Address]=e.Address,
[LastEmail] = ie.Email
FROM Emails e
OUTER APPLY
( SELECT TOP 1 *
FROM Email innerE
WHERE e.UserID = innerE.UserID
AND innerE.Contact = @emailId
AND (IsSent is null OR isSent = 0)
ORDER BY Timestamp DESC
) ie