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