2012-12-11 58 views
2

我有這個疑問:有一個子查詢返回的行而不是列

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 

這工作得很好,但現在,我意識到我想獲得包含lastemail列整行,如果這是否可能,關於如何完成的任何想法?

回答

1

你可以這樣做:

;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; 
+0

我用這個答案和http://stackoverflow.com/a/1918586/27483的組合來提供我所需要的。而不是row_number(),我也使用了rank()。 – Irwin

0

如果你的DBMS支持的話,你可以使用APPLY(我認爲它,因爲它看起來像SQL-服務器語法)

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 

的使用方法類似一個相關的子查詢,但允許多行和多列。

相關問題