问题描述
所以我创建了 3 个带有值的表
#创建派对表
DROP TABLE IF EXISTS parties,districts,candidates;
CREATE TABLE parties ( party char(12) NOT NULL,PRIMARY KEY (party) );
INSERT INTO parties VALUES ('Conservative'),('Liberal'),('Socialist'),('Green'),('Libertarian');
#创建地区表
CREATE TABLE districts ( district char(10) DEFAULT NULL );
INSERT INTO districts VALUES ('Essex'),('Malton'),('RiverDale'),('Guelph'),('Halton');
#创建候选人表
CREATE TABLE candidates ( id int(11) NOT NULL,name char(10) DEFAULT NULL,district char(10) DEFAULT NULL,party char(10) DEFAULT NULL,PRIMARY KEY (id) );
INSERT INTO candidates VALUES (1,'Anne Jones','Essex','Liberal'),(2,'Mary Smith','Malton',(3,'Sara Black','RiverDale',(4,'Paul Jones','Socialist'),(5,'Ed White','Conservative'),(6,'Jim Kelly',(7,'Fred Price',(8,'Bill Green','Guelph','Green'),(9,'Garth Adams','Halton','Libertarian'),(10,'Sam Adams',(11,'Jill Mackay','Liberal');
现在我想知道哪些政党在所有选区都有候选人?
我已经这样做了,但我不确定这是否正确!!有人可以指导我吗?
select p.party
from parties p
inner join candidates c on p.party = c.party
inner join districts d on c.district = d.district;
解决方法
您可以使用聚合。然后用having
统计区数,看是否都包括:
select p.party
from parties p inner join
candidates c
on p.party = c.party
group by p.party
having count(distinct district) = (select count(*) from districts);
count(distinct)
处理一个政党在一个选区有多个候选人的情况。
双重反加入(排除所属选区没有该党派候选人的政党):
SELECT * FROM parties p
WHERE NOT EXISTS (
SELECT * FROM districts dx
WHERE NOT EXISTS (
SELECT * FROM candidates cx
WHERE cx.district = dx.district
AND cx.party = p.party
)
);