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函数使其更易于读取。