我有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
但我真正得到的输出并不是我想要的
答案 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
)