2015-01-22 2 views
0

Я читал в этом потоке ниже, что нет никакой разницы в данных, возвращаемых в запросе, где у вас есть предикат Where после объединения или " А ':Разница между 'where' и 'And' in in line query query join

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

Однако у меня есть разное число строк в моем запросе, который, используя вид запрос в линии в своем общем заявлении, когда я изменяю и/WHERE. Я заметил, что проблема возникает, когда я использую оператор row number over в моем запросе строки.

Причина, по которой я использую это, - это ограничить записи в строковом запросе только первой записью даты, чтобы я мог возвращать последующие, но связанные записи из внешнего запроса.

Однако, когда я меняю 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 

Но если я вновь последнюю лину и изменить где/и используется в не равен ID заявлении он дает немного больше строк при использовании и о качестве противоположный предикату WHERE.

+0

Просто добавил, что к моему оригинальному сообщению - это сервер sql 2005 – Andrew

+0

Вы ссылаетесь на таблицу C, которая является частью вашей производной таблицы, во внешнем запросе, и, кроме того, вы присоединяете ее к производной таблице E Я немного удивлен, что это не вызывает ошибки, но я не удивлен, что это дает неожиданные результаты. И как E даже имеет столбец f, если вы не включите его в список выбора производной таблицы? –

+0

Можете ли вы вставить фактический код, пожалуйста? Это очень вводит в заблуждение. – SouravA

ответ

0

В оригинальной редакции у вас было inner join в примере, поэтому я попросил вас отправить исходный код.

Обратите внимание, что RIGHT OUTER JOIN очень отличается от INNER JOIN при обращении с пунктом ON. В right outer join вы получаете все записи из правой таблицы независимо от того,AND на правом столе.

Так, в приведенном ниже запросе

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

вы получите все записи из Table2 даже когда вы поставили TABLE2.ID = 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. В таблице 8 используется внутреннее соединение, поэтому я предполагаю, что изменение AND/WHERE для уникального идентификатора не должно иметь никакого значения для возвращаемых результатов, что и происходит, если я не удалю последний оператор для присоединения к таблице 8. – Andrew