2016-01-07 192 views
0

我有一個SQL Server查詢,它試圖連接3個表。我得到我需要的結果,但有重複問題。INNER JOIN + JOIN返回複製結果

table1是主要記錄表。 table2基本上是一個用戶表。 table3是一個查詢表,將用戶連接到管理員。

我需要將一個用戶連接到連接到他自己和連接到他的經理(或他管理的人,如果是經理)的任何其他用戶的所有記錄。所有經理都是用戶,任何用戶都可以在table1上擁有一個記錄。

table3table2上的用戶標識連接到table2上的管理員用戶標識。

table3 (lookup table) 
id | altID 
15 | 205 
16 | 205 
17 | 205 
18 | 246 

table2 (user table) 
id | other_col 
15 | abc 
16 | def 
17 | ggg 
18 | hhh 
205| yyy 
246| zzz 

table1 (record table) 
id | record_data 
15 | abc 
16 | def 
17 | ggg 
18 | hhh 
205| yyy 
246| zzz 

用戶將放入他們的ID。所以如果id ='XYZ'。

SELECT c.id, c.col, s.col2, s.col3 
FROM table1 AS c 
INNER JOIN table2 AS s 
    ON c.id = s.id 
JOIN table3 AS p 
    ON c.id = p.id OR c.id = p.altID 
WHERE 
    (p.id = 'XYZ' 
    OR p.altID = 'XYZ') 
AND 
    (c.id = p.altID 
    OR c.id = p.id) 
AND 
    NULLIF(LTRIM(RTRIM(c.column)), '') IS NOT null 

這是給我所有相關的記錄(所有與XYZ有關的用戶)。但是,它包括兩次XYZ,我不知道爲什麼。

這是在SELECT聲明中使用DISTINCT(c.id)可解析的,但我試圖理解爲什麼複製是從頭開始的。

+0

第一:INNER JOIN和JOIN是同義詞。第二:你的意思是「所以如果id ='XYZ'。」 - table3沒有值'XYZ'。第三:如果你的意思是(15,16,17,18,205,246)中的'XYZ'值 - 你有205的雙打是絕對正常的。 – Ingaz

回答

1

這裏就是我得到的,當我通過邏輯查詢工作:從表1(c)在表2(S)

  • 聯接是比一,爲(S)包含單(c)中的「Id」的行。那裏沒有重複問題。

  • 然後,您將表1(c)添加到表3(p),從(c)中的「欠缺」id到用戶和經理列的該id中的所有行。因此,如果(c)中的項目由經理擁有,您將獲得一次或多次點擊,作爲用戶一次,對於,每次他們是經理。

最少,這就是我完全基於代碼和您提供的描述。

0

如果要顯示在table3中定義的關係USER-MANAGER,一種可行的方法是再次將查找表(table3)與用戶表(用於獲取管理器記錄)聯接。

SELECT c.id, s.other_col, p.altid, manager.other_col manager_name 
FROM table1 c 
JOIN table2 s 
    ON c.id = s.id 
LEFT OUTER JOIN table3 p 
    ON c.id = p.id 
LEFT OUTER JOIN table2 manager 
    ON p.altid = manager.id; 

     ID OTHER_COL  ALTID MANAGER_NAME 
---------- --------- ---------- ------------ 
     17 ggg    205 yyy   
     16 def    205 yyy   
     15 abc    205 yyy   
     18 hhh    246 zzz   
     246 zzz        
     205 yyy        

我正在使用OUTER JOIN,它會向用戶顯示管理員。 INNER JOIN將壓制這些記錄。