【发布时间】:2021-04-11 22:52:07
【问题描述】:
我想返回匹配所有parts 的key 的结果。给定:
create table things (
id int not null,
key int not null,
part character varying(1),
details character varying(64),
CONSTRAINT things_pkey PRIMARY KEY (id)
);
还有这个:
| id | key | part | details |
|---|---|---|---|
| 1 | 1 | a | 1a details |
| 2 | 1 | b | 1b details |
| 3 | 1 | c | 1c details |
| 4 | 2 | a | 2a details |
| 5 | 2 | b | 2b details |
| 6 | 2 | c | 2c details |
| 7 | 3 | a | 3a details |
| 8 | 3 | c | 3c details |
| 9 | 4 | b | 4b details |
| 10 | 5 | b | 5b details |
| 11 | 6 | b | 6b details |
| 12 | 6 | c | 6c details |
| 13 | 7 | a | 7a details |
| 14 | 8 | a | 8a details |
我可以做到这一点:
| id | key | part | details |
|---|---|---|---|
| 1 | 1 | a | 1a details |
| 2 | 1 | b | 1b details |
| 3 | 1 | c | 1c details |
| 4 | 2 | a | 2a details |
| 5 | 2 | b | 2b details |
| 6 | 2 | c | 2c details |
使用此查询:
select *
from things t
where t.key in (
select x.key
from things x
group by x.key
having count(distinct part) = 3
);
但我真的想匹配不同的部分,而不仅仅是它的数量,例如having distinct part = ['a', 'b', 'c']。我可以在查询中执行此操作还是仅在应用程序代码中执行此操作?
http://sqlfiddle.com/#!17/38b399/6
编辑
基本上,我所追求的是一大堆行,其中所有 parts 的 thing 都存在。一件事有八个部分。它们将被处理并删除此表中的记录。永远重复。
这是来自 pgAdmin 的 CREATE 脚本(噪音降低):
CREATE TABLE public.things (
id uuid PRIMARY KEY,
key character varying(255) COLLATE pg_catalog."default" NOT NULL,
part character varying(3) COLLATE pg_catalog."default" NOT NULL,
details character varying(1024) COLLATE pg_catalog."default",
timezone character varying(128) COLLATE pg_catalog."default",
client_id uuid,
CONSTRAINT things_client_id_fkey FOREIGN KEY (client_id)
REFERENCES public.clients (id)
);
CREATE INDEX things_client_id_index ON public.things (client_id);
CREATE UNIQUE INDEX unique_things ON public.things (key, part, client_id);
【问题讨论】:
-
您的查询有什么问题?
-
您要解决的原始问题是什么?
-
请说明您的确切过滤器要求,以及您正在寻找的确切结果。请务必公开您的 Postgres 版本。
-
(key, part)是否定义为UNIQUE?如果是这样,是否有UNIQUE约束(应该有)?有keys表吗?指向它的FOREIGN KEY约束? -
你能告诉我们预期的结果吗?
标签: sql postgresql relational-division