2014-05-05 69 views
2

例如。有这两个表我SELECT使用UNION子句

//DEPARTMENT 
DNAME   CITY 
-------------------- 
RESEARCH  BOSTON 
    IT   CITY 
SCIENCE  DALLAS 
RESEARCH  DALLAS 

因此,使用我这个说法

(SELECT DNAME FROM DEPARTMENT WHERE CITY='BOSTON') 
UNION 
(SELECT DNAME FROM DEPARTMENT WHERE CITY='DALLAS'): 

使用此声明我得到这个输出

DNAME 
----- 
RESEARCH 
SCIENCE 

但我的问题是选择无论是在“波士顿或'DALLAS'但在两者中,我的输出应该是这样的

DNAME 
-------- 
SCIENCE 

我应该改变什么以获得正确的输出

回答

3

您应该使用INTERSECTMINUS(对于Oracle):

-- At least at Boston or at Dallas 
(SELECT DNAME 
    FROM DEPARTMENT 
    WHERE CITY = 'DALLAS' 

UNION 

SELECT DNAME 
    FROM DEPARTMENT 
    WHERE CITY = 'BOSTON') 

MINUS 

-- At Boston and at Dallas 
(SELECT DNAME 
    FROM DEPARTMENT 
    WHERE CITY = 'DALLAS' 

INTERSECT 

SELECT DNAME 
    FROM DEPARTMENT 
    WHERE CITY = 'BOSTON') 

由于UNION增加子查询向上而EXCEPT/MINUS减去他们

0

问题是:UNION会自动删除所有重复项。因为,DNAME是唯一返回的列,它会删除重复

编辑 对于“达拉斯”或“波士顿要么DNAME的不同选择,这样的事情:

SELECT DNAME FROM DEPARTMENT 
       WHERE (CITY='BOSTON' and CITY<>'DALLAS') 
1

可以先筛选出dnames,然后使用GROUP BY只选择那些只出现在一个城市dnames。

select dname 
    from department 
where city in ('BOSTON', 'DALLAS') 
group by dname 
having count(city) = 1;