2010-07-17 8 views
2

내 쿼리는 항상 중복 결과를 생성합니다. 데이터베이스를 1 백만 개 이상 사용하여이 쿼리의 문제를 해결하는 가장 좋은 방법은 무엇입니까?중복 행을 생성하는 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. 영사가 그들을 또는 구별하면 충분 열을 선택하지 않기 때문에 당신의 결과 집합에 중복 행을 생산하는이 나타납니다 시스템에 여러 레코드가 당신의 절은 '아무튼 그들을 걸러 내지 마라.
  2. ON 절이 완전하지 않기 때문에 조인이 가짜 복제를 생성하고 있습니다.

두 가지 모두 필요한 수준의 도메인 지식을 가진 사람 만이 해결할 수 있습니다. 따라서 우리는 당신을 위해 그 질문을 고치지 않을 것입니다. 죄송합니다.

일부 중복 결과를 중복되지 않은 결과와 비교하고 첫 번째 그룹 공통점을 발견하면 두 번째 그룹과 구별됩니다.

저는 수백만 개의 행이있는 것이 쉽지 않다는 것을 말하지는 않습니다. 그러나 쉬운 일이라면 가치있는 일이 아닙니다.

+0

어떻게 ON 절이 완료되지 않았는지 설명 할 수 있습니까? – CodingIsAwesome

+4

@CodingAwesome - ON 절이 고유 키를 식별하지 못하면 교차 조인을 생성합니다. 테이블 중 하나에 복합 키가 있고 모든 열을 지정하지 않거나 고유 키가 아닌 열에 조인하는 경우이 문제가 발생할 수 있습니다. – APC

3

나는이 두 시간 내 자신을 가지고 있으며 항상 내 join statement 중 하나입니다. 한 번에 하나씩 조인 문을 제거하고 그 중 하나를 제거하면 중복 수를 줄이는 지 확인하려고합니다.

다른 옵션은 중복 된 행 집합을 찾아서 조인 값에 대한 조인의 각 테이블을 쿼리하고 되돌아 오는 것을 확인하는 것입니다.

또한 실행중인 데이터베이스와 버전은 무엇입니까?

관련 문제