2017-03-03 39 views
0

我有4个表SQL选择其中不存在

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

我想选择与部门所有分支机构有关系 我在这里查询

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 

我得到了我想要得到与查询。比方说像这样的输出(有在部门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

添加样品表数据及其预期结果。 (以及格式化文本。) – jarlh

+1

请标记您的dbms –

回答

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 
) 
+0

伟大的答案谢谢你,你会解释一下细节吗? –

+0

为什么我在这里失败 - >选择b.branch_id,b.branch_name,string_agg(DISTINCT dept.dept_name,',')作为门卫..........不存在(...... ..........)group by b.branch_id,b.branch_name –

+0

我想string_agg params必须是子查询。如果你想在一行中写所有代码,查询深度改变 –