如何消除SQL Server内部联接中的重复项

如何消除SQL Server内部联接中的重复项,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我将加入3个表机遇、领导、备注 我得到了副本。如何在使用内部联接时避免重复 主表是Opportunity,Notes与Opportunity id进行比较,Notes表中有许多记录具有相同的Opportunity,因此发生重复。现在,我如何在比较表和获取上次更新的注释时避免重复 先谢谢你 确保不要在此处意外使用笛卡尔积: from Opportunity O, Notes N 这应该只是 您已在稍后加入Notes表 因此,这里的查询应该不会返回任何重复项: Select O.opp

我将加入3个表机遇、领导、备注

我得到了副本。如何在使用内部联接时避免重复

主表是Opportunity,Notes与Opportunity id进行比较,Notes表中有许多记录具有相同的Opportunity,因此发生重复。现在,我如何在比较表和获取上次更新的注释时避免重复


先谢谢你

确保不要在此处意外使用笛卡尔积:

from Opportunity O, Notes N
这应该只是

您已在稍后加入Notes表

因此,这里的查询应该不会返回任何重复项:

Select 
     O.oppo_jobid, O.oppo_status,
     cast(N.Note_Note as NCHAR) as Notes 
from dbo.Opportunity O
Inner join dbo.Notes on o.Oppo_OpportunityId = Notes.Note_ForeignId 
Inner join dbo.Lead on o.Oppo_OpportunityId = Lead.Lead_OpportunityID
更新:如果您只需要每个opportunity的最新注释,请使用此查询:

;WITH MostRecent AS
(
    SELECT 
        O.oppo_jobid, O.oppo_status,
        cast(N.Note_Note as NCHAR) as Notes,
        ROW_NUMBER() OVER (PARTITION BY o.Oppo_OpportunityId 
                           ORDER BY n.Note_DateTimeStamp DESC) AS 'RowNum'
    FROM dbo.Opportunity O
    INNER JOIN dbo.Notes on o.Oppo_OpportunityId = Notes.Note_ForeignId 
)
SELECT *
FROM MostRecent
WHERE RowNum = 1

确保不要在此处意外地使用笛卡尔积:

from Opportunity O, Notes N
这应该只是

您已在稍后加入Notes表

因此,这里的查询应该不会返回任何重复项:

Select 
     O.oppo_jobid, O.oppo_status,
     cast(N.Note_Note as NCHAR) as Notes 
from dbo.Opportunity O
Inner join dbo.Notes on o.Oppo_OpportunityId = Notes.Note_ForeignId 
Inner join dbo.Lead on o.Oppo_OpportunityId = Lead.Lead_OpportunityID
更新:如果您只需要每个opportunity的最新注释,请使用此查询:

;WITH MostRecent AS
(
    SELECT 
        O.oppo_jobid, O.oppo_status,
        cast(N.Note_Note as NCHAR) as Notes,
        ROW_NUMBER() OVER (PARTITION BY o.Oppo_OpportunityId 
                           ORDER BY n.Note_DateTimeStamp DESC) AS 'RowNum'
    FROM dbo.Opportunity O
    INNER JOIN dbo.Notes on o.Oppo_OpportunityId = Notes.Note_ForeignId 
)
SELECT *
FROM MostRecent
WHERE RowNum = 1

+我还想知道如何加入Lead。似乎未使用,可能应替换为存在或完全删除。在notes表中,我有许多记录具有相同的opportunity id。我需要内部联接notes表并检查最近日期的上次更新。选择O.Oppo\U orderstatus作为状态,O.Oppo\U jobid作为jobid,N.Note\U Note作为备注,N.Note\U jobid作为jobid,N.Note\u Updated by as UpdateDate,CastCONVERTDECIMAL10,2,O.Oppo\u currentprice as nvarchar as Total,CastCONVERTDECIMAL10,2,O.Oppo\u currentpmts as nvarchar as Payment,O.Oppo\u branchid as Branch,O.Oppo\u mb as mb,O.Oppo_statuschgdt AS ChangeDate FROM Notes N internal JOIN Opportunity O ON O.Oppo_OpportunityId=N.Note_foreigned where Note_UpdatedBy=Select maxNote_UpdatedBy FROM Notes您不会得到重复的-您只得到几行,因为每个Opportunity都有多个Notes。。。。那么你到底想要什么呢?+1还想知道如何加入Lead。似乎未使用,可能应替换为存在或完全删除。在notes表中,我有许多记录具有相同的opportunity id。我需要内部联接notes表并检查最近日期的上次更新。选择O.Oppo\U orderstatus作为状态,O.Oppo\U jobid作为jobid,N.Note\U Note作为备注,N.Note\U jobid作为jobid,N.Note\u Updated by as UpdateDate,CastCONVERTDECIMAL10,2,O.Oppo\u currentprice as nvarchar as Total,CastCONVERTDECIMAL10,2,O.Oppo\u currentpmts as nvarchar as Payment,O.Oppo\u branchid as Branch,O.Oppo\u mb as mb,O.Oppo_statuschgdt AS ChangeDate FROM Notes N internal JOIN Opportunity O ON O.Oppo_OpportunityId=N.Note_foreigned where Note_UpdatedBy=Select maxNote_UpdatedBy FROM Notes您不会得到重复的-您只得到几行,因为每个Opportunity都有多个Notes。。。。那么你真正想要的是什么呢???你的cast表达式castN.Note\u Note as NCHAR将返回一个固定的30个字符长的列,这肯定是你想要的结果吗?加入领导团队的目的是什么?也很容易理解。您的cast表达式castN.Note\u Note as NCHAR将返回一个固定的30个字符长的列,这肯定是您想要的结果吗?加入领导团队的目的是什么?也很容易理解。