2015-10-13 34 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獨特'表格,很明顯,在你的場景中不是這樣的 – Lamak

+2

只是一面的說法:不要在IN子句中使用DISTINCT。將它留給DBMS來決定如何查找列表中的值。它可能會或可能不會決定首先在列表上使用不同的列表。 –

回答

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進行了唯一約束,或者只是在se中加上一個獨特的約束LECT *
選擇不同*

如果別的東西是怎麼回事,請張貼實際數據來重現問題

相關問題