简单sql查询

简单sql查询,sql,oracle,Sql,Oracle,我有以下三张桌子 salesman(sid,sname) location(lid,lname) sales_loc(sid,lid) 现在我想打印访问过所有地点的saleman的sid和sname。 我需要SQL查询,而不需要PL/SQL代码。另一种方法: select sid, sname from salesman where not exists (select 1 from location where not exists

我有以下三张桌子

salesman(sid,sname)
location(lid,lname)
sales_loc(sid,lid)
现在我想打印访问过所有地点的saleman的sid和sname。 我需要SQL查询,而不需要PL/SQL代码。

另一种方法:

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));
select sid, sname from salesman
where
  (select count(*) from location) =
  (select count(*) from sales_loc where sales_loc.sid = salesman.sid)
编辑: 如果sales_locsid,lid pair不是密钥,下面的查询更合适, 正如ammoQ建议的那样:

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

获取所有销售人员记录,其中访问的位置数等于访问的位置数

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);
再来一杯

考虑到这些推销员和他们的地盘

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>

这应该行得通。我已经试过了

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)
它使用要比较的位置总数。

SalesmanID,sname locationlid,lname 销售地点,盖子

从销售人员s、位置l、销售地点sl中选择s.sid、s.sname 其中s.sid=sl.sid
我正要猜作业。但是家庭作业很少涉及像甲骨文这样的软件……嗯,现在有了一个快速版本;也许有什么事情让我头晕目眩,但我很难理解你在问什么。这两个表是如何链接的?格雷格:sales_loc在sales和location上都有一个外键,因此链接了这两个表:-好的-很抱歉打断了。。。我要去贝多好吧,这很有趣。从来没有想过你可以否定这个说法;很好。是的,我仍在努力想:刘易莎:我去过任何地方,但没有我去过的地方。+1,尽管它做出了一些假设;我将第二个子查询设为select COUNTLID。。。因此,当一名销售人员和一名销售人员在sales_loc中有多个条目时,它仍然有效location@ammoQ,你说得对。我做了那个假设。我将编辑我的答案以包含您的建议。在sqlserver中使用此查询的任何人都应将减号更改为除外。您还应将别名附加到第二个select语句。从中选择ss.sid。。。