在select sql中不是两个子句

时间:2014-04-24 06:27:30

标签: 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' ;

但这将显示位于波士顿或达拉斯的部门。但我只是想要,我应该放什么才能得到结果。

实施例: 在我的DEPTLOC表中

     //DEPTLOC
     DNAME      CITY
     ----------------
     ACCOUNTING  BOSTON
     ACCOUNTING  DALLAS
     SALES       DALLAS
     TRANSPORT   BOSTON
     TRANSPORT   DALLAS

所以在我的部门 我应该得到像

这样的输出
      DNAME
      ----------
      SALES

5 个答案:

答案 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