我在这里遇到一些SQL查询问题。我想选择多个网站中的客户示例 peter>> site1 peter>> site2 peter site3 请我尝试了很多查询,但我的事情不正确我需要更合乎逻辑的东西在oracle sql plus中。
SQL> select * from HHCCUSTOMERS;
OID O_CNAME CID O_SITE O_BOOKDAT DEPOSIT PAYMENT
1220 tess 120 site3 10-DEC-15 500 1500
1240 hilda 140 site3 30-JAN-16 300 1500
1250 isla 150 site2 04-JAN-16 750 1000
1260 hilda 160 site1 05-FEB-16 800 2000
1280 maija 180 site3 20-NOV-15 650 1500
1290 iris 190 site3 10-DEC-15 600 1500
1200 tess 120 site3 10-DEC-15 500 1500
1202 hilda 140 site2 30-JAN-16 300 1500
1203 louise 130 site1 20-NOV-15 600 1000
选择了9行。 我使用了此查询
select o_cname,oid,o_site,c_type,c_facility
from HHCCUSTOMERS
inner join HHCPARK
on HHCPARK.cid=HHCCUSTOMERS.cid
where o_cname='louise' or o_cname='hilda';
O_CNAME OID O_SITE C_TYPE C_FACILITY
---------- ---------- ------- ---------- ----------
louise 1203 site1 bronze semifurnis
hilda 1240 site3 silver digitalvan
hilda 1202 site3 silver digitalvan
hilda 1260 site1 gold customize
答案 0 :(得分:2)
如果您想要客户,那么您可以这样做:
select c.o_cname
from hhcustomers c
group by c.o_cname
having min(o_site) <> max(o_site);
另一种选择是:
having count(distinct o_site) > 1
count(distinct)
会产生额外的开销,因此min()
/ max()
通常会有更好的效果。
如果您需要详细信息,那么一种方法就是分析函数:
select c.*
from (select c.*,
count(distinct o_site) over (partition by o_cname) as numsites
from hhcustomers c
) c
where numsites > 1;
或者,没有直接统计网站的替代方法使用exists
:
select c.*
from hhcustomers c
where exists (select 1
from hhcustomers c2
where c2.o_cname = c.o_cname and c2.o_site <> c.o_site
);
答案 1 :(得分:0)
这听起来好像要使用count(.)
和group by
;
SELECT O_CNAME, COUNT(O_SITE) AS C FROM HHCCUSTOMERS WHERE C > 1 GROUP BY O_CNAME
注意:没有检查此查询。
答案 2 :(得分:0)
尝试这种方式:
select o_cname, count(*)
from HHCCUSTOMERS
inner join HHCPARK
on HHCPARK.cid=HHCCUSTOMERS.cid
where o_cname='louise' or o_cname='hilda'
GROUP BY o_cname
HAVING count(*)>1;
如果你离开where子句,它会检查louise
或hilda
,如果你把它放在哪里,它会显示同时位于多个地方的每个人。