SQL select不存在的地方

时间:2017-03-03 08:31:17

标签: sql postgresql

我有4张桌子

branch          target         target_dept   dept
--------        ---------      -----------   --------
branch_id       target_id      target_id     dept_id
branch_name     branch_id      dept_id       dept_name

我想选择具有关系的dept的所有分支 这是我的查询

select b.branch_id, b.branch_name,dept.dept_name
from branch b
left join target ptar on ptar.branch_id=b.branch_id
left join target_dept pdept on pdept.target_id=ptar.target_id
left join dept dept on pdept.dept_id=dept.dept_id

我得到了我想要的查询。让我们说像这样的输出(dept上有5个数据)

B001 | KUALA LUMPUR | DEPT1
B001 | KUALA LUMPUR | DEPT2
B002 | BALI         | DEPT3
B002 | BALI         | DEPT4
B002 | BALI         | DEPT5
B003 | MANILLA      | 

我想得到没有任何关系的部门的分支,因此我使用不存在这样的查询

select b.branch_id, b.branch_name,dept.dept_name
from branch b
left join target ptar on ptar.branch_id=b.branch_id
left join target_dept pdept on pdept.target_id=ptar.target_id
left join dept dept on not exists(select null where pdept.dept_id=dept.dept_id)

我想得到的输出是这样的

B001 | KUALA LUMPUR | DEPT3
B001 | KUALA LUMPUR | DEPT4
B001 | KUALA LUMPUR | DEPT5
B002 | BALI         | DEPT1
B002 | BALI         | DEPT2
B003 | MANILLA      | DEPT1
B003 | MANILLA      | DEPT2
B003 | MANILLA      | DEPT3
B003 | MANILLA      | DEPT4
B003 | MANILLA      | DEPT5

但我真正得到的输出并不是我想要的

1 个答案:

答案 0 :(得分:1)

如果我理解你的目标,试试这个:

此查询选择未与部门链接的所有分支

策略:

我在分支机构和部门之间应用笛卡尔产品,因此我放弃了与您的分支机构相关联的所有部门,因此只保留分支机构而不与部门建立链接。

SELECT b.branch_id, b.branch_name,dept.dept_name
FROM branch b
CROSS JOIN dept d
WHERE NOT EXISTS(
    SELECT 'LINKED'
    FROM target T
    JOIN target_dept TD
        ON T.target_id = TD.target_id
    JOIN dept D2
        ON D2.dept_id = TD.dept_id
    WHERE D2.dept_id = d.dept_id
    AND b.branch_id = t.branch_id
)