写一个查询,可以显示哪些政党在所有地区都有候选人?

问题描述

所以我创建了 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
                )
        );