将两个相同的表连接到另一个表,并在同一行中输出(相同)表的信息

时间:2018-04-21 06:31:18

标签: sql postgresql

对于糟糕/长标题感到抱歉,但我不知道该怎么做。

我想要做的是加入' A'桌子并加入到' B'表格中的两个' A'有一个共同的外键,显示来自A' A'同一行中的表,同时防止重复,例如pic中的示例:

enter image description here

我知道查询只是在做它的工作,但有没有办法防止重复'通过比较输出之前的行?

这是我尝试的内容,我知道它可能性能不佳而且可能有更好的方法,但这适用于具有小型数据库的小型项目,其中性能不应该是真正重要的:

SELECT w.emp_id AS emp1_id, w2.emp_id AS emp2_id, 
    e.fname || ' ' || e.lname AS emp1_name, e1.fname || ' ' || e1.lname AS emp2_name,
    e.jobtitle AS emp1_jobtitle, e1.jobtitle AS emp2_jobtitle, e2.fname || ' ' || e2.lname AS cs_name
FROM work_on w 
    LEFT JOIN work_on w2 
        on w.emp_id != w2.emp_id and w.ticket_id = w2.ticket_id 
    LEFT JOIN employee e
        on w.emp_id = e.emp_id
    LEFT JOIN employee e1
        on w2.emp_id = e1.emp_id
    LEFT JOIN ticket t 
        on t.ticket_id = w.ticket_id
    LEFT JOIN customer_problem p 
        on p.problem_id = t.problem_id
    LEFT JOIN employee e2
        on e2.emp_id = p.emp_id
WHERE e2.emp_id = 20 and p.submit_date >= '2018-04-08' 
    and p.submit_date <= '2018-04-11' and e1.emp_id != e.emp_id
ORDER BY w.emp_id;

我的桌子:

Employee: | Work_On:   | Ticket:      | Problem
----------+------------+--------------+------------
emp_id      work_id      ticket_id      problem_id
fname       emp_id       problem_id     emp_id
lname       ticket_id

在这种情况下,我尝试在 Work_On 上合并两个员工,其中共有票证,另一个员工通过问题表连接到故障单。

1 个答案:

答案 0 :(得分:1)

以下是使用最少/最大的一个选项:

SELECT DISTINCT
    LEAST(w.emp_id, w2.emp_id) AS emp1_id,
    GREATEST(w.emp_id, w2.emp_id) AS emp2_id,
    LEAST(e.fname || ' ' || e.lname, e1.fname || ' ' || e1.lname) AS emp1_name,
    GREATEST(e.fname || ' ' || e.lname, e1.fname || ' ' || e1.lname) AS emp2_name,
    LEAST(e.jobtitle, e1.jobtitle) AS emp1_jobtitle,
    GREATEST(e.jobtitle, e1.jobtitle) AS emp2_jobtitle,
    e2.fname || ' ' || e2.lname AS cs_name
FROM work_on w 
LEFT JOIN work_on w2 
    ON w.emp_id != w2.emp_id AND w.ticket_id = w2.ticket_id 
LEFT JOIN employee e
    ON w.emp_id = e.emp_id
LEFT JOIN employee e1
    ON w2.emp_id = e1.emp_id
LEFT JOIN ticket t 
    ON t.ticket_id = w.ticket_id
LEFT JOIN customer_problem p 
    ON p.problem_id = t.problem_id
LEFT JOIN employee e2
    ON e2.emp_id = p.emp_id
WHERE
    e2.emp_id = 20 AND
    p.submit_date >= '2018-04-08' AND
    p.submit_date <= '2018-04-11' AND
    e1.emp_id != e.emp_id
ORDER BY w.emp_id;

要了解为什么最少/最好的技巧有效,请考虑以下两个记录/列:

emp1_id | emp2_id
2       | 15
15      | 2

应该很清楚,虽然现在这些记录是不同的,但如果我们改为选择id最小的id后跟最大的id,它们看起来是相同的:

LEAST(emp_id1, emp_id2) | GREATEST(emp_id1, emp_id2)
2                       | 15
2                       | 15

然后,使用SELECT DISTINCT删除两个重复行中的一个。