SQL SERVER中的EXISTS运算符

时间:2014-02-17 17:59:24

标签: sql-server

实际上我怀疑存在运算符

有两张桌子。

CREATE TABLE EMPDETAIL(
EID NUMERIC(8),
NAME VARCHAR(20),
DOB DATE,
ADDRESS VARCHAR(50),
CONTACTNO NUMERIC(13)
)

CREATE TABLE EMPWEBDETAIL(
EID NUMERIC(8),
EMAIL VARCHAR(30),
USERID VARCHAR(10),
PSWORD VARCHAR(10)
)

现在我想获得在empdetail表中有条目但不在empwebdetail中的员工,

我可以使用连接,子查询,相关子查询

来实现

但我想用exists运算符来做.. 解决方案是

SELECT A.EID, A.NAME FROM EMPDETAIL AS A WHERE EXISTS( SELECT B.EID FROM EMPWEBDETAIL AS B WHERE A.EID = B.EID)

这会给我想要的结果

我的查询仅限于检查父母的表达会产生某些结果,或者我们可以说如果它返回正确或错误,其工作仅限于上述情况

但是看看下面的第二个问题..

SELECT A.EID, A.NAME FROM EMPDETAIL AS A WHERE EXISTS(SELECT B.EID FROM EMPDETAIL AS B WHERE B.EID IN (111,112,113))

根据以前的结果,它应该只给我这三个雇员的记录(111,112,113) 但是它给了EMPDETAIL TABLE的完整行...

3 个答案:

答案 0 :(得分:2)

这是你想要的吗?

SELECT  A.EID, A.NAME 
FROM    EMPDETAIL AS A 
WHERE   EXISTS(SELECT B.EID FROM EMPWEBDETAIL AS B WHERE A.EID = B.EID) 
AND     A.EID IN (111,112,113)

第一个示例中的exists子句有效,因为您正在使用A.EID = B.EID对两个查询进行关联。保留该信息并为WHERE添加额外的IN查询过滤器。

答案 1 :(得分:0)

不,存在将返回该行的存在部分为真的所有行。

因此甚至

SELECT A.EID, A.NAME 
FROM EMPDETAIL AS A 
WHERE EXISTS(SELECT B.EID FROM EMPDETAIL AS B WHERE 1 = 1)

将返回EMPDETAIL

中的所有行

看一下下面的演示

SQL Fiddle DEMO

答案 2 :(得分:0)

您仍需要将EXISTS表加入外部查询表以限制结果。您的第二个查询需要更多:

SELECT A.EID, A.NAME 
FROM EMPDETAIL AS A 
WHERE EXISTS(SELECT B.EID FROM EMPDETAIL AS B 
             WHERE B.EID = A.EID AND B.EID IN (111,112,113))

或更好的版本是:

SELECT A.EID, A.NAME 
FROM EMPDETAIL AS A 
WHERE EXISTS(SELECT B.EID FROM EMPDETAIL AS B WHERE B.EID = A.EID) 
   AND A.EID IN (111,112,113))