簡體   English   中英

在join中使用與眾不同的關鍵字

[英]Using distinct keyword with join

我的教授給了我一個作業。

編寫一個查詢,該查詢將生成帶有Orders表中的訂單的所有銷售人員的snum值(禁止重復)。

銷售人員

序號(4)
Sname varchar2(10)
城市varchar2(10)
通訊編號(3,2)

顧客

貨號(4)
Cname varchar2(10)
城市varchar2(10)
等級數(4)
序號(4)

命令

本體數(4)
修改數量(7,2)
大館日期
貨號(4)
序號(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。 有人能指出我正確的方向嗎?

謝謝。

該問題要求您“編寫一個查詢,該查詢將在Orders表中生成帶有訂單的所有銷售人員的snum值(禁止重復)”-它沒有指定您需要包括訂單號。 (這意味着你不需要順序的數字,由於包括他們,你將復制SNUM值。)

鑒於snum出現在Orders表上,因此從ORDERS表中選擇SNUM值的DISTINCT列表應該相對簡單。

在查詢中,從SELECT中刪除onum-

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

這應該只顯示不同的snum。

您只需要從1個表中進行選擇:

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

注意:我保留了order by子句,但是嚴格按照給出的答案回答它不是必須的。

上面的兩個答案似乎都是正確的,但似乎

select distinct snum
from ordrs
order by snum

要么

select snum
from ordrs
group by snum
order by snum

效率更高,因為我們不需要閱讀銷售人員。 如果表ordrs中的snum有外鍵約束,則可以接受。

注意:當我寫這篇文章時,托尼剛剛回答了。 我會100%同意他:)

而且也可以輕松地通過子查詢而不是聯接來完成:

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

基本上說:給我所有在ordrs表中具有至少1條匹配記錄的snum。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM