INNER JOIN + JOIN返回重复结果

时间:2016-01-07 18:32:22

标签: sql-server join

我有一个SQL Server查询,它试图连接3个表。我得到了我需要的结果,但是有重复问题。

table1是主记录表。 table2基本上是一个用户表。 table3是一个将用户连接到管理员的查找表。

我需要将一个用户连接到连接到他自己的所有记录以及连接到他的经理(或他管理的人,如果是经理)的任何其他用户。所有经理都是用户,任何用户都可以拥有' table1上的记录。

table3table2上的用户ID与table2上的经理的用户ID相关联。

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,我无法弄清楚原因。

这可以使用DISTINCT(c.id)语句中的SELECT进行解析,但我试图理解为什么重复发生的原因。

2 个答案:

答案 0 :(得分:1)

这是我在查询中使用逻辑时得到的结果:

  • 从table1(c)到table2(s)的连接是一对一的,因为(s)包含一行,其中“(c)”中的Id为“name”。那里没有重复问题。

  • 然后将table1(c)连接到表3(p),从(c)中的“due”id到该id的(p)中的所有行,用户和管理列。因此,如果(c)中的项目由经理拥有,您将获得一次或多次点击,一次为他们作为用户一次为每个时间他们是经理。

Leastways,这就是我根据你提供的代码和描述而得出的结论。

答案 1 :(得分: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将取消这些记录。