Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅在第一个结果上加入查询_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 仅在第一个结果上加入查询

Sql 仅在第一个结果上加入查询,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,我正在创建一个存储过程,在这个过程中,我只想从每个匹配中返回第一条记录,而不是每个匹配的记录 到目前为止,我已经编写了以下代码: SELECT Tenant.FirstNames AS LeadTenantFirstName, Tenant.LastNames AS LeadTenantLastNames, Deposit.CertificateNumber AS DPCNumber FROM tblMemberPropertyDepositTenantHistory

我正在创建一个存储过程,在这个过程中,我只想从每个匹配中返回第一条记录,而不是每个匹配的记录

到目前为止,我已经编写了以下代码:

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
问题是,它将为证书查询中的每个租户带回一条记录,但我想只带回为每个证书创建的第一个租户


有什么想法吗

我假设TBLMemberPropertyDepositoryThistory(存款)有一个主键:

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
    )

如果我理解正确,你需要这样的东西:

;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

Deposit.CertificateNumber是tblMemberPropertyDeposits表中唯一需要的列吗?在可能的值之间进行选择的逻辑是什么?这工作绝对完美,性能非常好。非常感谢你的帮助。您可能还知道,我使用了左连接而不是内部连接。这是因为如果没有行,内部联接将过滤掉空行。左路会合仍然会带来租户。与在联接中使用max或min相比,行号也是更好的选择,CTE函数使其更易于读取。