查找最近两年内在另一个 table 中没有新引用的所有条目
Finding all entries with no new reference in another table within last two years
我有以下三个表:
CREATE TABLE group (
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE customer (
id SERIAL PRIMARY KEY,
ext_id VARCHAR NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE customer_in_group (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
group_id INT NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT customer_id_fk
FOREIGN KEY(customer_id)
REFERENCES customer(id),
CONSTRAINT group_id_fk
FOREIGN KEY(group_id)
REFERENCES group(id)
)
我需要找到所有在过去两年内没有任何 customer_in_group 实体的 group_id 列引用它们的组。然后我打算删除所有引用它们的customer_in_groups,最后在找到它们后删除那个组。
所以基本上给出了下面的两组和下面的3个customer_in_groups
Group
| id | name | insert_date |
|----|--------|--------------------------|
| 1 | group1 | 2011-10-05T14:48:00.000Z |
| 2 | group2 | 2011-10-05T14:48:00.000Z |
Customer In Group
| id | group_id | customer_id | insert_date |
|----|----------|-------------|--------------------------|
| 1 | 1 | 1 | 2011-10-05T14:48:00.000Z |
| 2 | 1 | 1 | 2020-10-05T14:48:00.000Z |
| 3 | 2 | 1 | 2011-10-05T14:48:00.000Z |
我希望能找回 group2,因为 group1 在过去两年中插入了一个 customer_in_group 引用它。
我不确定如何编写可以找到所有这些组的查询。
作为初学者,我建议在 customer_in_group
的外键上启用 on delete cascade
。
然后,您可以只从 groups
中删除您想要的行,它会删除子 table 中的依赖行。为此,您可以使用 not exists
:
delete from groups g
where not exists (
select 1
from customer_in_group cig
where cig.group_id = g.id and cig.insert_date >= now() - interval '2 year'
)
我有以下三个表:
CREATE TABLE group (
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE customer (
id SERIAL PRIMARY KEY,
ext_id VARCHAR NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE customer_in_group (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
group_id INT NOT NULL,
insert_date TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT customer_id_fk
FOREIGN KEY(customer_id)
REFERENCES customer(id),
CONSTRAINT group_id_fk
FOREIGN KEY(group_id)
REFERENCES group(id)
)
我需要找到所有在过去两年内没有任何 customer_in_group 实体的 group_id 列引用它们的组。然后我打算删除所有引用它们的customer_in_groups,最后在找到它们后删除那个组。
所以基本上给出了下面的两组和下面的3个customer_in_groups
Group
| id | name | insert_date |
|----|--------|--------------------------|
| 1 | group1 | 2011-10-05T14:48:00.000Z |
| 2 | group2 | 2011-10-05T14:48:00.000Z |
Customer In Group
| id | group_id | customer_id | insert_date |
|----|----------|-------------|--------------------------|
| 1 | 1 | 1 | 2011-10-05T14:48:00.000Z |
| 2 | 1 | 1 | 2020-10-05T14:48:00.000Z |
| 3 | 2 | 1 | 2011-10-05T14:48:00.000Z |
我希望能找回 group2,因为 group1 在过去两年中插入了一个 customer_in_group 引用它。
我不确定如何编写可以找到所有这些组的查询。
作为初学者,我建议在 customer_in_group
的外键上启用 on delete cascade
。
然后,您可以只从 groups
中删除您想要的行,它会删除子 table 中的依赖行。为此,您可以使用 not exists
:
delete from groups g
where not exists (
select 1
from customer_in_group cig
where cig.group_id = g.id and cig.insert_date >= now() - interval '2 year'
)