使用带有连接的distinct关键字

时间:2010-11-15 12:32:00

标签: sql oracle

我的教授给了我一个任务。

  

编写一个将产生的查询   所有销售人员的snum值   (压制重复)订单   在订单表中。

SalesPeople

Snum number(4)
Sname varchar2(10)
城市varchar2(10)
通讯号码(3,2)

客户

Cnum number(4)
Cname varchar2(10)
城市varchar2(10)
评分号码(4)
Snum number(4)

订单

Onum number(4)
金额(7,2)
大日期
数字(4)
Snum number(4)

我不确定我是否完全理解了这个问题。

我使用join编写了查询。

select distinct s.snum,onum
from salespeople s, ordrs o
where s.snum = o.snum
order by snum;

,输出

      SNUM       ONUM
---------- ----------
      1001       3003
      1001       3008
      1001       3011
      1002       3005
      1002       3007
      1002       3010
      1004       3002
      1007       3001
      1007       3006

但我不希望重复SNUM。有人能指出我正确的方向吗?

感谢。

5 个答案:

答案 0 :(得分:4)

问题要求您“在订单表中使用订单编写将产生所有销售人员的snum值的查询(禁止重复)” - 它没有指定您需要包含订单号。 (这意味着您需要订单号,因为通过包含它们,您将复制snum值。)

鉴于Snum出现在Orders表中,从ORDERS表中选择一个SNUM值的DISTINCT列表应该相对简单。

答案 1 :(得分:1)

在您的查询中从SELECT -

中删除onum
select distinct s.snum
from salespeople s, ordrs o
where s.snum = o.snum
order by snum;

这应该只显示不同的snum。

答案 2 :(得分:1)

您只需从1个表中选择:

select distinct o.snum
from ordrs o
order by o.snum;

注意我保留了按顺序排列的条款,但并不是严格要求回答这个问题。

答案 3 :(得分:1)

以上两个答案似乎都是正确的,但似乎

select distinct snum
from ordrs
order by snum

select snum
from ordrs
group by snum
order by snum

会更有效率,因为我们不需要阅读销售人员。如果表ordrs中的snum存在外键约束,则可以接受。

注意:托尼在我写这篇文章时刚回答。我会100%同意他的意见:)。

答案 4 :(得分:0)

使用子查询而不是连接也可以轻松完成:

select s.snum
from salespeople s
where exists (
  select 1
  from ordrs
  where snum = s.snum
);

基本上说:给我所有在ordrs表中至少有1个匹配记录的snum。