Использование отличного ключевого слова с соединением - PullRequest
2 голосов
/ 15 ноября 2010

Мой профессор дал мне задание.

Напишите запрос, который произведет значения snum всех продавцов (исключите дубликаты) с заказами в таблице Orders.

SalesPeople

Номер Snum (4)
Имя varchar2 (10)
Город varchar2 (10)
Номер связи (3,2)

Клиент

Номер Cnum (4)
Cname varchar2 (10)
Город varchar2 (10)
Рейтинговый номер (4)
Номер Snum(4)

Заказы

Номер Onum (4)
Номер Amt (7,2)
Дата истечения
Номер Cnum (4)
Snum number (4)

Я не уверен, что полностью понял вопрос.

Я написал запрос, используя соединение.

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 ]

4 голосов
/ 15 ноября 2010

Вопрос просит вас «Написать запрос, который произведет значения snum всех продавцов (исключить дубликаты) с заказами в таблице заказов» - в нем не указано, что вам нужно включать номера заказов. (Это означает, что вы не нуждаетесь в порядковых номерах, поскольку, включив их, вы продублируете значения snum.)

Принимая во внимание, что snum появляется в таблице «Заказы», ​​ВЫБЕРИТЕ СПИСОК DISTINCT значений SNUM ИЗ таблицы ORDERS, относительно просто.

1 голос
/ 15 ноября 2010

Оба ответа выше верны, но кажется, что

select distinct snum
from ordrs
order by snum

или

select snum
from ordrs
group by snum
order by snum

будет более эффективным, потому что нам не нужно читать продавцов.Это допустимо, если есть ограничение внешнего ключа для snum в таблице.

Примечание: Тони только что ответил, когда я писал это.Я бы на 100% согласился с ним:)

1 голос
/ 15 ноября 2010

Вам нужно только выбрать из 1 таблицы:

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

Примечание. Я сохранил заказ по пункту, но не обязательно отвечать на вопрос, как он был задан.

1 голос
/ 15 ноября 2010

В вашем запросе удалите onum из SELECT -

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

Это должно отображать только отчетливый snum.

0 голосов
/ 15 ноября 2010

И это также может быть легко сделано с помощью подзапроса вместо объединения:

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

, который в основном говорит: дай мне все snum, которые имеют по крайней мере 1 соответствующую запись в таблице ордеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...