2010-07-17 115 views
2

我的查詢總是產生重複的結果。如何使用數據庫> 100萬行解決此查詢的最佳做法。SQL查詢產生重複行,我看不出爲什麼

Select segstart 
    ,segment 
    ,callid 
    ,Interval 
    ,dialed_num 
    ,FiscalMonthYear 
    ,SegStart_Date 
    ,row_date 
    ,Name 
    ,Xferto 
    ,TransferType 
    ,Agent 
    ,Sup 
    ,Manager 
    ,'MyCenter' = Case Center 
When 'Livermore Call Center' Then 'LCC' 
When 'Natomas Call Center' Then 'NCC' 
When 'Concord Call Center' Then 'CCC' 
When 'Virtual Call Center' Then 'VCC' 
When 'Morgan Hill Call Center' Then 'MHCC' 
Else Center 
End 
    ,Xferfrom 
    ,talktime 
    ,ANDREWSTABLE.transferred 
    ,ANDREWSTABLE.disposition 
    ,dispsplit 
    ,callid 
    ,hsplit.starttime 
    ,CASE 
    WHEN hsplit.callsoffered > 0 
    THEN (CAST(hsplit.acceptable as DECIMAL)/hsplit.callsoffered)*100 
    ELSE '0' 
    END AS 'Service Level' 
    ,hsplit.callsoffered 
    ,hsplit.acceptable 
FROM 
(
Select segstart, 
    100*DATEPART(HOUR, segstart) + 30*(DATEPART(MINUTE, segstart)/30) as Interval, 
    FiscalMonthYear, 
    SegStart_Date, 
    dialed_num, 
    callid, 
    Name, 
    t.Queue AS 'Xferto', 
    TransferType, 
    RepLName+', '+RepFName AS Agent, 
    SupLName+', '+SupFName AS Sup, 
    MgrLName+', '+MgrFName AS Manager, 
    q.Center, 
    q.Queue AS 'Xferfrom', 
    e.anslogin, 
    e.origlogin, 
    t.Extension, 
    transferred, 
    disposition, 
    talktime, 
    dispsplit, 
    segment 
From CMS_ECH.dbo.CaliforniaECH e 

INNER JOIN Cal_RemReporting.dbo.TransferVDNs t on e.dialed_num = t.Extension 
INNER JOIN InfoQuest.dbo.IQ_Employee_Profiles_v3_AvayaId q on e.origlogin = q.AvayaID 
INNER JOIN Cal_RemReporting.dbo.udFiscalMonthTable f on e.SegStart_Date = f.Tdate 

Where SegStart_Date between getdate()-90 and getdate()-1 
    And q.Center not in ('Collections Center', 
         'Cable Store', 
         'Business Services Center', 
         'Escalations') 
    And SegStart_Date between RepToSup_StartDate and RepToSup_EndDate 
    And SegStart_Date between SupToMgr_StartDate and SupToMgr_EndDate 
    And SegStart_Date between Avaya_StartDate and Avaya_EndDate 
    And SegStart_Date between RepQueue_StartDate and RepQueue_EndDate 
    AND (e.transferred like '1' 
    OR e.disposition like '4') order by segstart 
) AS ANDREWSTABLE 

--Left Join CMS_ECH.dbo.hsplit hsplit on hsplit.starttime = ANDREWSTABLE.Interval and hsplit.row_date = ANDREWSTABLE.SegStart_Date and ANDREWSTABLE.dispsplit = hsplit.split 

回答

6

有兩種possibities:

  1. 有在您的系統的多個記錄將出現在您的結果集,產生重複的行,因爲你的投影不會選擇sufficent列來區分它們或您的where子句中沒有按」不要過濾它們。
  2. 由於ON子句不完整,您的連接會生成虛假重複項。

這兩種情況只能由具備必要的領域知識水平的人解決。所以我們不打算爲你解決這個問題。抱歉。

你需要做的是將一些重複的結果與一些不重複的結果進行comapare比較,並發現第一組的共同之處,這也與第二組有區別。

我不是說這很容易,尤其是數百萬行。但如果這很容易,那就不值得去做。

+0

你能解釋ON子句是如何不完整的嗎? – CodingIsAwesome 2010-07-17 05:38:32

+4

@CodingAwesome - 當ON子句不識別唯一鍵時,它們將產生交叉連接。如果其中一個表具有複合鍵,並且我們沒有指定其所有列或者如果我們連接到不是唯一鍵的列,則可能會發生這種情況。 – APC 2010-07-17 05:48:23

3

我已經進入了幾次我自己,它總是最終成爲我的聯合聲明之一。我會嘗試一次刪除一條連接語句,並查看是否刪除其中的一條減少了重複條目的數量。

另一種選擇是找到一組重複的行並查詢連接值中的連接中的每個表並查看返回的結果。

此外,您正在運行什麼數據庫和什麼版本?