Я читал в этом потоке ниже, что нет никакой разницы в данных, возвращаемых в запросе, где у вас есть предикат 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.
Просто добавил, что к моему оригинальному сообщению - это сервер sql 2005 – Andrew
Вы ссылаетесь на таблицу C, которая является частью вашей производной таблицы, во внешнем запросе, и, кроме того, вы присоединяете ее к производной таблице E Я немного удивлен, что это не вызывает ошибки, но я не удивлен, что это дает неожиданные результаты. И как E даже имеет столбец f, если вы не включите его в список выбора производной таблицы? –
Можете ли вы вставить фактический код, пожалуйста? Это очень вводит в заблуждение. – SouravA