我有一个SQL Server查询,它试图连接3个表。我得到了我需要的结果,但是有重复问题。
table1
是主记录表。 table2
基本上是一个用户表。 table3
是一个将用户连接到管理员的查找表。
我需要将一个用户连接到连接到他自己的所有记录以及连接到他的经理(或他管理的人,如果是经理)的任何其他用户。所有经理都是用户,任何用户都可以拥有' table1
上的记录。
table3
将table2
上的用户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
进行解析,但我试图理解为什么重复发生的原因。
答案 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将取消这些记录。