mayeye1989
2015-12-09 05:21
采纳率: 54.5%
浏览 1.4k

高分求解SQL疑难问题.

题目:找出没有销售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这个表呢呢?后来就写出了我的第二种解法.
写出来之后,两种方法输出一看,发现结果完全不一样,这是为什么呢?
以下是关系图,大家可以参考以下.
图片说明

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • _BenChen 2015-12-09 05:28
    已采纳

    两个当然不一样 举个例子

    QSALE里面有一个deptment 有销售过两种item 一个是Geo Positioning System 另一个是XXX

    第一个SQL是不会返回这个deptment
    而第二个SQL会返回的 以为这个deptment 也卖过不是Geo Positioning System的item

    总之 第一个SQL是“没有卖过” 第二个SQL是“有没卖过”

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • bdmh 2015-12-09 05:28

    所有的销售记录都在qsale中,所以你要找出没有销售的部门,当然要用not in了,你第二种是把qsale表中的单位取唯一了,而这里的单位不一定全啊,那些根本没有销售过任何东西的部门,你就找不到了

    评论
    解决 无用
    打赏 举报
  • JackWaiting 2015-12-09 05:36

    (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个毫不相干的查询语句。这样好理解吗?

    评论
    解决 无用
    打赏 举报
  • DV2 2015-12-09 07:49

    楼主首先要明白这么个道理:
    qdept表:存放了所有的部门信息
    qsale表:存放了所有的销售信息
    两者关系:qsale中的部门信息来自于qdept。qdept.deptname是qsale的外键
    结论:qsale中不一定含有全部的qdept。
    简单的理解下:也就是说假如这个部门没有任何的销售记录,那么qsale是不是就不含有这个部门信息了,也就是说qsale中qdept的信息是不全的。
    既然不全,楼主第二种做法还对吗???????
    举个例子:假如刚成立了一个销售部门,然而还没任何销售成绩。那么对于楼主第二种写法是不是就遗漏了这个部门。所以从理论上楼主第二种解答方法是**错的**。必须是先在销售表中找到销售过GEO POSITIONING SYSTEM的部门,然后从部门表(qdept)去排除。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题