2011-08-30 78 views
1

我加入3个表OpportunityLeadNotes如何内摆脱重复的加入在SQL Server

Select 
    Distinct O.oppo_jobid, O.oppo_status, 
    cast(N.Note_Note as NCHAR) as Notes 
from Opportunity O, Notes N 
Inner join Notes on o.Oppo_OpportunityId = Notes.Note_ForeignId 
Inner join Lead on o.Oppo_OpportunityId = Lead.Lead_OpportunityID 

我得到重复。如何在使用内部连接时避免重复?

主要表为OpportunityNotesopportunity id进行了比较和Notes表在如此重复出现同样的机会多条记录。现在,我怎样才能避免重复,同时比较表和获取最后更新的笔记。

在此先感谢...

+1

你施放表达'投(N.Note_Note as NCHAR)'会返回一个固定的30个字符长度的列,这绝对是期望的结果吗?加入“铅”的目的是什么? –

+0

[this one](http://stackoverflow.com/questions/13534939/duplicated-results-when-performing-inner-join)也很容易理解。 – Sohail

回答

4

确保你不小心做一个笛卡尔乘积这里:

from Opportunity O, Notes N 

这应该是

from Opportunity O 

你已经INNER后来加入注意表...

次所以此查询应该有希望不会返回任何重复:

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 

更新:,如果你只想要为每个机会,最近note - 使用此查询:

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

+1也想知道关于Lead的加入。似乎没有被使用,也许应该用“EXISTS”替换或完全删除。 –

+0

在笔记表中我有很多记录具有相同的机会ID。我需要内部连接笔记表并检查最近更新的最近日期。 – user919430

+0

SELECT O.Oppo_orderstatus作为状态,O.Oppo_jobid作为作业ID,\t \t 作为N.Note_Note注释,N.note_jobid如的JobId,N.Note_UpdatedBy如UpdateDate, \t CAST(CONVERT(DECIMAL(10,2),O。 Oppo_currentprice)为nvarchar的)为总, \t CAST(CONVERT(DECIMAL(10,2),O.Oppo_currentpmts)为nvarchar的)付款, \t O.Oppo_branchid为分公司,O.Oppo_mb AS MB,O.Oppo_statuschgdt AS CHANGEDATE \t从NotesňINNER JOIN机遇o在O.Oppo_OpportunityId = N.Note_ForeignId \t其中Note_UpdatedBy =(SELECT MAX(Note_UpdatedBy)从Notes) – user919430