2012-02-15 39 views
0

我正在創建一個存儲過程,我希望從每個匹配中取回第一條記錄,而不是每條匹配的記錄。僅在第一條結果時加入查詢

到目前爲止我寫了下面的代碼:

SELECT 
    Tenant.FirstNames AS LeadTenantFirstName, Tenant.LastNames AS LeadTenantLastNames, 
    Deposit.CertificateNumber AS DPCNumber 

    FROM tblMemberPropertyDepositTenantHistory AS Tenant 
    INNER JOIN tblMemberPropertyDeposits AS Deposit 
    ON Tenant.MemberPropertyDepositID = Deposit.MemberPropertyDepositID 

的問題是,它會帶給我們一個記錄查詢中每個證書的租戶,但我想帶回只是第一爲每個證書創建租戶?

任何想法?

+0

是Deposit.CertificateNumber您從唯一需要的列tblMemberPropertyDeposits表? 什麼是可能的值之間進行選擇的邏輯? – Diego 2012-02-15 10:36:15

+0

@Diego是的,它是 – ediblecode 2012-02-15 10:37:44

回答

2

如果我理解你的權利,你需要這樣的事:

;WITH CTE AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY Tenant.MemberPropertyDepositID ORDER BY Tenant.MemberPropertyDepositID) AS RowNbr, 
     Tenant.MemberPropertyDepositID, 
     Tenant.FirstNames, 
     Tenant.LastNames 
    FROM 
     tblMemberPropertyDepositTenantHistory AS Tenant 
) 
SELECT 
    Tenant.FirstNames AS LeadTenantFirstName, 
    Tenant.LastNames AS LeadTenantLastNames, 
    Deposit.CertificateNumber AS DPCNumber 
FROM 
    tblMemberPropertyDeposits AS Deposit 
    LEFT JOIN CTE AS Tenant 
     ON Tenant.MemberPropertyDepositID=Deposit.MemberPropertyDepositID 
     AND Tenant.RowNbr=1 
+0

這絕對完美,性能非常好。非常感謝你 – ediblecode 2012-02-15 10:48:56

+1

很高興幫助。你可能也知道我使用了一個內連接的左連接。這是因爲如果沒有行,則內部聯接將過濾掉爲空的行。左參加仍將帶來租戶。行號也是一個更好的選擇,然後在連接中使用max或min,並使用CTE函數更容易閱讀。 – Arion 2012-02-15 10:52:41

0

我認爲tblMemberPropertyDepositTenantHistory(存款)有一個主鍵:

SELECT 
    Tenant.FirstNames AS LeadTenantFirstName, Tenant.LastNames AS LeadTenantLastNames, 
    Deposit.CertificateNumber AS DPCNumber 
    FROM tblMemberPropertyDepositTenantHistory AS Tenant 
    INNER JOIN tblMemberPropertyDeposits AS Deposit 
    ON Deposit.PrimaryKey = (
     SELECT MIN(tblMemberPropertyDepositTenantHistory.PrimaryKey) 
     FROM tblMemberPropertyDepositTenantHistory 
     WHERE tblMemberPropertyDepositTenantHistory.MemberPropertyDepositID = 
       Tenant.MemberPropertyDepositID 
    )