计算不在另一个表中的行

时间:2019-03-16 07:15:09

标签: sql postgresql

我有下表用于管理将哪个配置文件用于什么服务。

个人资料表

CREATE TABLE public.profile
(
    id integer NOT NULL DEFAULT nextval('profile_id_seq'::regclass),
    name text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT profile_id PRIMARY KEY (id)
)

服务表

CREATE TABLE public.service
(
    id integer NOT NULL DEFAULT nextval('service_id_seq'::regclass),
    name text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT service_id PRIMARY KEY (id)
)

二手表

CREATE TABLE public.used
(
    id integer NOT NULL DEFAULT nextval('used_id_seq'::regclass),
    service_id bigint NOT NULL,
    profile_id bigint NOT NULL,
    insert_timestamp timestamp with time zone NOT NULL DEFAULT now(),
    CONSTRAINT used_id PRIMARY KEY (id),
    CONSTRAINT used_profile_id_fkey FOREIGN KEY (profile_id)
        REFERENCES public.profile (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE,
    CONSTRAINT used_service_id_fkey FOREIGN KEY (service_id)
        REFERENCES public.service (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
)

我正在尝试创建一个SQL查询,该查询将计算profile_id不在特定服务的used表中的总配置文件。假设我们的服务称为“ gym”,如何计算服务名称为“ gym”的未使用表中的概要文件数量?

1 个答案:

答案 0 :(得分:1)

首先,您需要将used表与service表联接以访问每个service text记录的used。然后,您需要添加service text等于gym的条件,最后使用not in条件,可以选择所提供的子查询中不存在的配置文件的数量。

select count(*) from public.profile
where id not in
(select u.profile_id from public.used u inner join public.service s
 on s.id = u.service_id
where s.text = 'gym')
相关问题