题目:找出没有销售GEO POSITIONING SYSTEM的部门
标准解:
SELECT deptname
FROM qdept
where deptname not in
(select deptname from qsale
where itemname = 'Geo Positioning System')
我的解法
(select distinct deptname from qsale
where itemname != 'Geo Positioning System')
第一种解法我能明白它的逻辑.
但是我后来想,,既然qsale已经有我需要的两个变量了,为何还要引用qdept这个表呢呢?后来就写出了我的第二种解法.
写出来之后,两种方法输出一看,发现结果完全不一样,这是为什么呢?
以下是关系图,大家可以参考以下.
两个当然不一样 举个例子
QSALE里面有一个deptment 有销售过两种item 一个是Geo Positioning System 另一个是XXX
第一个SQL是不会返回这个deptment
而第二个SQL会返回的 以为这个deptment 也卖过不是Geo Positioning System的item
总之 第一个SQL是“没有卖过” 第二个SQL是“有没卖过”
所有的销售记录都在qsale中,所以你要找出没有销售的部门,当然要用not in了,你第二种是把qsale表中的单位取唯一了,而这里的单位不一定全啊,那些根本没有销售过任何东西的部门,你就找不到了
(select distinct deptname from qsale where itemname != 'Geo Positioning System')
你这是把itemname这个字段不为Geo Positioning System'的查出来在过滤重复。
SELECT deptname
FROM qdept
where deptname not in
(select deptname from qsale
where itemname = 'Geo Positioning System')
而答案里也的逻辑是子查询,先在qsale这个表查询出所有的itemname不为Geo Positioning System'的deptname,在以此为条件去去qdept这张表查询,
这样能一样嘛?完全是2个毫不相干的查询语句。这样好理解吗?
楼主首先要明白这么个道理:
qdept表:存放了所有的部门信息
qsale表:存放了所有的销售信息
两者关系:qsale中的部门信息来自于qdept。qdept.deptname是qsale的外键
结论:qsale中不一定含有全部的qdept。
简单的理解下:也就是说假如这个部门没有任何的销售记录,那么qsale是不是就不含有这个部门信息了,也就是说qsale中qdept的信息是不全的。
既然不全,楼主第二种做法还对吗???????
举个例子:假如刚成立了一个销售部门,然而还没任何销售成绩。那么对于楼主第二种写法是不是就遗漏了这个部门。所以从理论上楼主第二种解答方法是**错的**。必须是先在销售表中找到销售过GEO POSITIONING SYSTEM的部门,然后从部门表(qdept)去排除。