2015-10-13 4 views
0

Два SQL-запроса, приведенные ниже, должны дать мне точно такой же результат, но по какой-то причине первый запрос, который использует соединение вместо подзапроса, дает мне гораздо больше результатов. Единственное отличие - последняя строка в обоих выборках. Может ли кто-нибудь сказать мне, почему?SQL-запросы должны делать то же самое, но не

SELECT * 
FROM TravelReport TR 
    JOIN School SC ON SC.SchoolId = TR.SchoolId 
    LEFT OUTER JOIN [User] U ON U.UserId = TR.UserId 
          AND U.UserTypeId = 3 
          AND U.UserStatusId = 1 
    JOIN ProjectSchools PS ON PS.SchoolId = SC.SchoolId 
WHERE PS.Active = 1 
    AND PS.ProjectId = 2 

=====

SELECT * 
FROM TravelReport TR 
    JOIN School SC ON SC.SchoolId = TR.SchoolId 
    LEFT OUTER JOIN [User] U ON U.UserId = TR.UserId 
          AND U.UserTypeId = 3 
          AND U.UserStatusId = 1 
WHERE SC.SchoolId in (SELECT DISTINCT PS.SchoolId FROM ProjectSchools PS 
         WHERE PS.Active = 1 AND PS.ProjectId = 2) 
+6

Единственный способ эти 2 запросы будут давать те же результаты, как если 'SchoolId' является уникальным в' ProjectSchools 'table, и, очевидно, это неверно в вашем сценарии – Lamak

+2

Просто побочное замечание: не используйте предложения DISTINCT on IN. Оставьте это в СУБД, чтобы решить, как искать значения в списке. Он может или не может принять решение использовать отдельные в списке в первую очередь. –

ответ

0

Можно устранить влево, как это не должно повлиять на любое количество.
Вы уверены, что не просто получаете больше того же результата?

SELECT * 
    FROM TravelReport TR  
    JOIN School SC 
     ON SC.SchoolId = TR.SchoolId 
    JOIN ProjectSchools PS 
     ON PS.SchoolId = SC.SchoolId 
WHERE PS.Active = 1 
    AND PS.ProjectId = 2 
===== 

SELECT * 
    FROM TravelReport TR 
    JOIN School SC 
     ON SC.SchoolId = TR.SchoolId 
WHERE SC.SchoolId in (SELECT DISTINCT PS.SchoolId 
          FROM ProjectSchools PS 
         WHERE PS.Active = 1 
          AND PS.ProjectId = 2) 

Рассмотрим этот

SchoolID Active ProjectID 
10  1  2 
10  1  2 
10  1  1 
11  2  2 
12  1  2 
13  1  2 
13  2  2 

Первый будет возвращать два ряда для schoolID 10, а второго не

Может быть, школа может иметь несколько активных проектов, так что вы не можете сделать SchoolID уникальным
При аренде ставьте уникальное ограничение на SchoolID, Active, ProjedtID

Или просто положите отдельное место в Lect *
выбрать отличный *

Если что-то еще происходит, пожалуйста, опубликовать фактические данные, чтобы воспроизвести проблему

Смежные вопросы