2009-11-27 2 views
0

У меня есть 3 таблицы следующим образом.простой запрос sql

salesman(sid,sname) 
location(lid,lname) 
sales_loc(sid,lid) 

Теперь я хочу распечатать сид и змею салмана, который посетил все места. Я хочу SQL-запрос, и мне не нужен код PL/SQL.

+2

Я собирался угадать домашнюю работу. Но домашнее задание редко включает в себя программное обеспечение, такое как Oracle ... – Joey

+0

Ну, теперь есть экспресс-версия;) – MartW

+0

Возможно, что-то пошло «нахальство» над моей головой, но мне сложно понять, что вы просите. Как эти две таблицы связаны каким-либо образом? – Greg

ответ

7
select sid, sname from salesman 
where not exists 
     (select 1 from location 
      where not exists 
        (select 1 from sales_loc 
        where sid=saleman.sid 
        and lid = location.lid)); 
+0

Oookay, это интересно один. Никогда не думал о том, что вы можете отрицать это утверждение; хороший. – Joey

+0

Да, я все еще пытаюсь оборачивать вокруг себя :) – cflewis

+1

Lewisham: Я был везде, когда нет места, где я не был. –

4

Другой подход:

select sid, sname from salesman 
where 
    (select count(*) from location) = 
    (select count(*) from sales_loc where sales_loc.sid = salesman.sid) 

Edit: В случае sales_loc(sid,lid) пара не является ключевым, ниже запрос является более подходящим,
, как ammoQ предложил:

select sid, sname from salesman 
where 
    (select count(*) from location) = 
    (select count(distinct lid) from sales_loc where sales_loc.sid = salesman.sid) 
+0

человек читается :) – Amarghosh

+0

* вздох * защелка ... =) – Will

+0

+1, хотя он делает некоторые предположения; Я бы сделал второй подзапрос «select count (отличная крышка) ...», поэтому он по-прежнему работает, когда в sales_loc имеется более одной записи для продавца и местоположения –

0

Получить все реквизиты продавца, где количество посещенных мест равно количеству мест ЦИИ.

select sm.* from salesman as sm 
where (select count(sl.*) from sales_loc as sl where sl.sid = sm.sid) 
= (select count(l.*) from location as l); 
0

Еще один для горшка!

Учитывая эти продавцы и их территории ...

SQL> select s.sname, l.lname 
    2 from salesman s 
    3   , location l 
    4   , sales_loc sl 
    5 where sl.sid = s.sid 
    6 and sl.lid = l.lid 
    7 order by s.sid, l.lid 
    8/

SNAME  LNAME 
---------- ---------- 
FOX  TRAIN 
FOX  BOAT 
KNOX  BOAT 
KNOX  HOUSE 
SAM  TRAIN 
SAM  BOAT 
SAM  HOUSE 

7 rows selected. 

SQL> 

... этот запрос извлекает тот, кто посетил все из них ...

SQL> select s.sname 
    2 from salesman s 
    3 where s.sid not in (
    4  select sid from (
    5   select cjs.sid, cjl.lid 
    6   from salesman cjs 
    7     cross join location cjl 
    8   minus 
    9   select sl.sid, sl.lid 
10   from sales_loc sl 
11  ) 
12 ) 
13/

SNAME 
------ ---- 
SAM 

SQL> 
+0

Любой пользователь, использующий этот запрос в sqlserver, должен изменить минус на исключение. – Tebo

+0

Вы также должны приложить псевдоним ко второй операции выбора. выберите ss.sid из (...) – Tebo

0

Это должно работать. Я попробовал.

select a.sid, a.salesman, count(a.sid) as total from salesman a 
inner join sales_loc b on b.sid = a.sid 
inner join location c on c.lid = b.lid 
group by a.sid, a.salesman 
having count(a.sid) = (select count(*) from location) 

В нем используется общее количество мест для сравнения.

0

продавец (SID, SNAME) расположения (крышка, LNAME) sales_loc (SID, крышка)

выберите s.sid, s.sname из продавцов с, расположением л, sales_loc сл где s.sid = sl.sid и l.lid = sl.lid