2015-01-22 2 views
0

아래의이 스레드에서 읽은 데이터에는 쿼리에서 반환되는 데이터의 차이가 없습니다. 여기에는 조인 후 Where 조건 자 또는 ' 그리고 '나는/어디에서이 변경 될 때, 내 전체 성명에서 인라인 뷰 쿼리를 사용하고 내 쿼리에 다른 행 수를해야합니까 그러나'where'와 'And'in line view join에서의 차이점

description of difference between 'where' and 'And' in join

. 내 in-line 쿼리에서 행 넘버를 사용하면이 문제가 발생하는 것으로 나타났습니다.

내가 이것을 사용하는 이유는 첫 번째 날짜 레코드로만 인라인 쿼리의 레코드를 제한하는 것이므로 외부 쿼리에서 후속이지만 관련 레코드를 반환 할 수 있습니다.

그러나 WHERE를 AND로 변경하면 행 수가 달라집니다.

내 쿼리는 다음과 유사합니다

SELECT DISTINCT 
     table1.userID, 
     table2.UniqueID, 
     table3.entrydate, 
     table2.entrytime, 
     table4.changedatestart, 
     table2.changetimestart, 
     table5.changedateend, 
     table2.changetimeend, 
     table6.leavedate, 
     table2.leavetime, 
     table7.nationality_ID, 
     table8.reg_code 
     FROM 
     table1 INNER JOIN table2 ON (table1.t1_KEY=table2.t2_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table4 ON (change_start_date_alias.DATEKEY=table2.change_date_start_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table5 ON (change_end_date_alias.DATEKEY=table2.change_date_end_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table3 ON (entry_date_alias.DATEKEY=table2.ENTRY_DATE_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table6 ON (leave_date_alias.DATEKEY=table2.LEAVE_DATE_KEY) 
     RIGHT OUTER JOIN table7 ON (table7.nat_KEY=table2.nat_KEY) 
     INNER JOIN table8 ON (table8.reg_DEPT_KEY=table2.reg_DEPT_KEY) 
     RIGHT OUTER JOIN dbo.table9 ON (table9.leave_KEY=table2.leave_KEY) 
    INNER JOIN 
     (SELECT 
     table1.userID UID, 
     ROW_NUMBER() OVER (PARTITION BY table1.userID ORDER BY table3.entrydate ASC) as Seq, 
     table2.UniqueID "Unique_ID", 
     table3.entrydate "entry_date", 
     table2.entrytime "entry_time", 
     table4.changedatestart "change_start_Date", 
     table2.changetimestart "change Start Time", 
     table5.changedateend "change End Date", 
     table2.changetimeend "change End Time", 
     table6.leavedate "leave Date", 
     table2.leavetime "leave time", 
     table7.nationality_ID "Nationality ID", 
     table8.reg_code "Registration Code" 
     FROM 
     table1 INNER JOIN table2 ON (table1.t1_KEY=table2.t2_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table4 ON (change_start_date_alias.DATEKEY=table2.change_date_start_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table5 ON (change_end_date_alias.DATEKEY=table2.change_date_end_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table3 ON (entry_date_alias.DATEKEY=table2.ENTRY_DATE_KEY) 
     RIGHT OUTER JOIN DATETIMETABLE table6 ON (leave_date_alias.DATEKEY=table2.LEAVE_DATE_KEY) 
     RIGHT OUTER JOIN table7 ON (table7.nat_KEY=table2.nat_KEY) 
     INNER JOIN table8 ON (table8.reg_DEPT_KEY=table2.reg_DEPT_KEY) 
     RIGHT OUTER JOIN dbo.table9 ON (table9.leave_KEY=table2.leave_KEY) 
     WHERE table3.entrydate BETWEEN '20131201' AND '20140531' 
     AND table8.reg_DESC In ('Value1','Value2','Value3','Value4','Value5' ) 
     AND table9.leave_CODE IN ('11','15','16','22','25','27','54','57','66') 
     )b 
    ON b.UID = table1.userID 
    **AND b.Unique_ID <> table2.UniqueID** 
    AND b.Seq = 1 
    AND b.[Registration Code] = table8.reg_code << If this line is commented out the same row count is returned whether WHERE/AND is used in not equal to ID statement: 

AND/WHERE b.Unique_ID <> table2.UniqueID 

을하지만 마지막 린을 재 도입하고 WHERE/변경 및 ID 문에 동일하지에 사용 된 것처럼 AND 문을 사용할 때 약간 더 행을 제공합니다 WHERE 술어에 반대합니다.

+0

방금 ​​SQL Server 2005에 추가했습니다. – Andrew

+0

파생 테이블의 일부인 테이블 C를 외부 쿼리에서 참조하고 있으며 파생 테이블 E에 조인하고 있습니다. 나는 이것이 약간의 오류를 발생시키지 않는다고 놀랍지 만, 예기치 않은 결과를내는 것은 놀랄 일이 아니다. 파생 테이블의 선택 목록에 포함시키지 않으면 E는 어떻게 열 f를 갖게됩니까? –

+0

실제 코드를 붙여 넣을 수 있습니까? 이것은 매우 오도하기 쉬운 것입니다. – SouravA

답변

0

예를 들어 원래 편집에서 inner join이 있었으므로 원본 코드를 게시하도록 요청했습니다.

RIGHT OUTER JOINON 절을 처리 할 때 INNER JOIN과 매우 많이 다릅니다. right outer join의 경우 오른쪽 테이블 에 관계없이과 일치하는 모든 레코드를 AND에 가져옵니다.

그래서, 아래 쿼리에서,

SELECT * FROM Table1 RIGHT OUTER JOIN Table2 ON Table1.ID = Table2.Id 
AND TABLE2.ID = 2 

당신은 당신이 TABLE2.ID = 2을도 넣을 때 표 2 에서 모든 레코드를 얻을. 단지 효과가 없습니다. 반면, 아래 쿼리에서

SELECT * FROM Table1 RIGHT OUTER JOIN Table2 ON Table1.ID = Table2.Id 
WHERE TABLE2.ID = 2 

TABLE2.ID = 2에 대한 레코드 만 표시됩니다.

그러나 내부 조인에 대한

, 모두 아래 쿼리는 유사하다 :

SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.Id 
AND TABLE2.ID = 2 
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.Id 
WHERE TABLE2.ID = 2 

그래서주의 AND 조건을 처리하십시오 당신이 대략 RIGHT JOINS을 이야기하지 않을 때!

나는 비슷한 질문을 언젠가 물어 보았다. here.

+0

당신이 논의하고있는 쿼리의 조인을 설명 할 수 있습니까? 내 외부 쿼리와 하위 쿼리 사이의 조인에 대한 '내부 조인'이 있는데, 이것이 당신이 가리키고있는 것이라면 전체 시간입니다. 감사. – Andrew

+0

당신은 table2 RIGHT OUTER JOIN 같은 것을 가지고 있습니다 ....... b. 따라서 'AND b.Unique_ID <> table2.UniqueID' 조건은'WHERE b.Unique_ID <> table2.UniqueID'와는 완전히 다릅니다. – SouravA

+0

나는 당신이 준 연결과 위의 설명에서 무엇을 말하고 있는지 이해하지만, 을 사용할 때 반환 된 결과에 영향을 미치는 마지막 조건 (표 8)에 대한 조인을보고 있는데 거기에는 외부 조인이 없다. 표 8에서는 내부 조인을 사용하므로 유니크 ID에 대한 AND/WHERE를 변경하면 리턴 된 결과에 아무런 차이가 없어야하며, 테이블 8에 대한 조인에 대한 마지막 명령문을 제거하지 않는 한 가정합니다. – Andrew