select sql中的not TOWER子句中的任意一个
查找位于波士顿或达拉斯的所有部门的名称,而不是两个城市的名称 我有这样的代码select sql中的not TOWER子句中的任意一个,sql,oracle,Sql,Oracle,查找位于波士顿或达拉斯的所有部门的名称,而不是两个城市的名称 我有这样的代码 SELECT D.DNAME FROM DEPARTMENT D INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME WHERE L.CITY='BOSTON' OR L.CITY='DALLAS' ; --take only those that ara in one city SELECT DNAME_WITH_COUNT.DNAME FROM --coun
SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
WHERE L.CITY='BOSTON'
OR L.CITY='DALLAS' ;
--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;
但这将显示位于波士顿或达拉斯的部门。但我只想进入其中任何一个,我应该投入什么才能得到结果
例如:
在我的DEPTLOC表中
//DEPTLOC
DNAME CITY
----------------
ACCOUNTING BOSTON
ACCOUNTING DALLAS
SALES DALLAS
TRANSPORT BOSTON
TRANSPORT DALLAS
所以在我的部门
我应该得到像这样的输出
DNAME
----------
SALES
您可以使用聚合查询联接
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
试试这个:
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);
将它们分组,然后计算每个部门的总数,然后筛选只有一个位置的所有部门
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
你可以写:
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
;
试试这样的
SELECT D.DNAME
FROM DEPARTMENT D
INNER JOIN DEPTLOC L ON L.DNAME = D.DNAME
WHERE L.CITY='BOSTON'
OR L.CITY='DALLAS' ;
--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;
你在使用哪种RDBMS?如果它有两个位置,但达拉斯和纽约呢?看起来,问题正好是波士顿和达拉斯。经过测试。工作完美。我仍然理解代码!谢谢你。我可以问@Minh。如果两个位置不同。它会出现两次吗?还是仍然相同?@user3553846:它仍然有效。他是对的。有计数(1)=1不受其他位置的影响。您可以添加更多数据并重试。