2009-11-27 120 views
0

我有3個表格,如下所示。簡單的sql查詢

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

現在我想打印的SID和誰曾經訪問過的所有位置推銷員的SNAME。 我想要一個SQL查詢,我不想要一個PL/SQL代碼。

+2

我正要猜測作業。但是,家庭作業很少涉及像Oracle這樣的軟件...... – Joey 2009-11-27 08:23:00

+0

好吧,現在有一個Express版本;) – MartW 2009-11-27 08:24:44

+0

也許某些東西在我頭腦上傳開了「whoosh」,但我很難理解你在問什麼。這兩個表如何鏈接? – Greg 2009-11-27 08:24:46

回答

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 2009-11-27 08:26:41

+0

是的,我仍然試圖圍繞它:) – cflewis 2009-11-27 08:34:49

+1

Lewisham:我到處都沒有地方,我沒有去過。 – 2009-11-27 09:01:57

4

的另一種方法:

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

編輯: 萬一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 2009-11-27 08:46:37

+0

* sigh * snap ... =) – Will 2009-11-27 08:46:38

+0

+1,儘管它做出了一些假設;我將第二個子查詢設置爲「select count(distinct lid)...」,所以當sales_loc中有一個以上的銷售員和地址條目時,它仍然有效。 – 2009-11-27 08:47:52

0

獲取所有銷售員recs訪問的地點數等於loca的數量蒸發散。

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中使用此查詢的任何人都應該將minus改爲except。 – Tebo 2009-11-27 09:35:30

+0

您還應該爲第二個select語句附加一個別名。從(...)中選擇ss.sid – Tebo 2009-11-27 09:40:48

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) 位置(蓋,L-NAME) sales_loc(SID,蓋子)

選擇s.sid,從推銷員小號s.sname,位置升,sales_loc SL 其中s.sid = sl.sid and l.lid = sl.lid