查找位于波士顿或达拉斯的所有部门的名称"而不是在两个城市。
我有这样的代码
SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
WHERE L.CITY='BOSTON'
OR L.CITY='DALLAS' ;
但这将显示位于波士顿或达拉斯的部门。但我只是想要,我应该放什么才能得到结果。
实施例: 在我的DEPTLOC表中
//DEPTLOC
DNAME CITY
----------------
ACCOUNTING BOSTON
ACCOUNTING DALLAS
SALES DALLAS
TRANSPORT BOSTON
TRANSPORT DALLAS
所以在我的部门 我应该得到像
这样的输出 DNAME
----------
SALES
答案 0 :(得分:4)
对它们进行分组,然后计算每个部门的总计数,然后过滤所有只有一个位置的部门。
SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
WHERE L.CITY='BOSTON'
OR L.CITY='DALLAS'
GROUP BY
D.DNAME
HAVING COUNT(1) = 1
答案 1 :(得分:1)
试试这个:
SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
GROUP BY D.DNAME
HAVING 1 = SUM(CASE WHEN L.CITY IN ('BOSTON', 'DALLAS') THEN 1 ELSE 0 END);
答案 2 :(得分:1)
你可以写:
SELECT department.dname
FROM department
JOIN deptloc
ON department.dname = deptloc.dname
WHERE deptloc.city IN ('BOSTON', 'DALLAS')
GROUP
BY department.dname
HAVING COUNT(DISTINCT deptloc.city) = 1
;
就此而言,由于deptloc.dname
中的每个值都可能出现在department.name
中,因此您可以免除连接并写下:
SELECT dname
FROM deptloc
WHERE city IN ('BOSTON', 'DALLAS')
GROUP
BY dname
HAVING COUNT(DISTINCT city) = 1
;
答案 3 :(得分:1)
尝试这样的事情
--take only those that ara in one city
SELECT DNAME_WITH_COUNT.DNAME FROM
--count how many times it occurs
(SELECT DNAME, COUNT(DNAME) CNT FROM
--your select with both cities
(SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
WHERE L.CITY='BOSTON'
OR L.CITY='DALLAS'
)
)DNAME_WITH_COUNT
WHERE CNT>1;
答案 4 :(得分:0)
您可以使用聚合查询加入department
表,该查询每个部门只返回一个位置:
SELECT d.dname
FROM department d
INNER JOIN (SELECT dname
FROM deptloc
WHERE city IN ('BOSTON', 'DALLAS')
GROUP BY dname
HAVING COUNT(*) = 1) l ON l.dname = d.dname