Postgresql 如何检索记录,但仅当每个链接子实体列';存档';设置为真?
我有一个名为Record的实体存储在postgresql表中 这些记录可以在备份介质上存档 关联是这样的:记录关联表媒体 一条记录可以与多个媒体关联。关联表提供了一个属性:归档为布尔值 我想写一个返回记录列表的查询。 但我只想在与媒体的每个关联都将“存档”属性设置为true时查找记录 样本: 媒体(id、名称)Postgresql 如何检索记录,但仅当每个链接子实体列';存档';设置为真?,postgresql,jpa,eclipselink,Postgresql,Jpa,Eclipselink,我有一个名为Record的实体存储在postgresql表中 这些记录可以在备份介质上存档 关联是这样的:记录关联表媒体 一条记录可以与多个媒体关联。关联表提供了一个属性:归档为布尔值 我想写一个返回记录列表的查询。 但我只想在与媒体的每个关联都将“存档”属性设置为true时查找记录 样本: 媒体(id、名称) 1、第一媒体 2、第二媒体 记录(id、名称) 10,第一条记录 20,第二条记录 30,第三次记录 关联(媒体id、记录id、存档) 1,10,正确 2、10、假 1,20,假 1,3
1、第一媒体
2、第二媒体 记录(id、名称)
10,第一条记录
20,第二条记录
30,第三次记录 关联(媒体id、记录id、存档)
1,10,正确
2、10、假
1,20,假
1,30,正确
2,30,对 这里我们有3条记录,记录10链接到媒体1和2,但媒体2没有存档,所以我不想要它。记录20仅链接到媒体1,但未存档,我也不想要它。然后,记录30链接到介质1和2,并且都标记为已存档。这就是我想找的那种唱片 我试过这样的方法:
SELECT r FROM Record r, ArchiveMediasRecords ass, AchiveMedia a WHERE ass MEMBER OF r.medias AND ass MEMBER OF a.records AND ass.archived = true
但是ass.archived=true不是一个匹配“每个”关联的标准
谢谢
注:Java8U51、Eclipselink 2.6和PostgreSQL 9.4
编辑,使用纯SQL提供以下信息:
EXPLAIN SELECT * FROM recorder.records r WHERE true = ALL (
SELECT archived FROM recorder.archive_medias_records WHERE record_id = r.id
)
Seq Scan on records r (cost=0.00..6026.82 rows=190 width=182)
Filter: (SubPlan 1)
SubPlan 1
-> Seq Scan on archive_medias_records (cost=0.00..31.63 rows=9 width=1)
Filter: (record_id = r.id)
实际数据:
记录2001;.....
2002;.....
2003;..... 媒体
1.“扑通一声”
5.“plip” 关联
1.2001;真的
1;2002;TRUE
5;2002;FALSE
1;2003;TRUE
5;2003;TRUE
预期:
记录2001年和2003年可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:
上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:
上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:
上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”: 上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。DDL和示例数据:
CREATE TABLE media (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO media VALUES
(1,'PLop'),
(5,'plip');
CREATE TABLE record (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO record VALUES
(2001,'First record'),
(2002,'Second record'),
(2003,'Third record');
CREATE TABLE assosiation(
mediaid INTEGER REFERENCES media(id),
recordid INTEGER REFERENCES record(id),
archived BOOLEAN
);
INSERT INTO assosiation VALUES
(1,2001,true),
(1,2002,true),
(5,2002,false),
(1,2003,true),
(5,2003,true);
下面的psql返回预期值:
SELECT * FROM record r WHERE
true = ALL (
SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:
id | name
------+--------------
2001 | First record
2003 | Third record
(2 rows)
DDL和示例数据:
CREATE TABLE media (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO media VALUES
(1,'PLop'),
(5,'plip');
CREATE TABLE record (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO record VALUES
(2001,'First record'),
(2002,'Second record'),
(2003,'Third record');
CREATE TABLE assosiation(
mediaid INTEGER REFERENCES media(id),
recordid INTEGER REFERENCES record(id),
archived BOOLEAN
);
INSERT INTO assosiation VALUES
(1,2001,true),
(1,2002,true),
(5,2002,false),
(1,2003,true),
(5,2003,true);
下面的psql返回预期值:
SELECT * FROM record r WHERE
true = ALL (
SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:
id | name
------+--------------
2001 | First record
2003 | Third record
(2 rows)
DDL和示例数据:
CREATE TABLE media (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO media VALUES
(1,'PLop'),
(5,'plip');
CREATE TABLE record (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO record VALUES
(2001,'First record'),
(2002,'Second record'),
(2003,'Third record');
CREATE TABLE assosiation(
mediaid INTEGER REFERENCES media(id),
recordid INTEGER REFERENCES record(id),
archived BOOLEAN
);
INSERT INTO assosiation VALUES
(1,2001,true),
(1,2002,true),
(5,2002,false),
(1,2003,true),
(5,2003,true);
下面的psql返回预期值:
SELECT * FROM record r WHERE
true = ALL (
SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:
id | name
------+--------------
2001 | First record
2003 | Third record
(2 rows)
DDL和示例数据:
CREATE TABLE media (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO media VALUES
(1,'PLop'),
(5,'plip');
CREATE TABLE record (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO record VALUES
(2001,'First record'),
(2002,'Second record'),
(2003,'Third record');
CREATE TABLE assosiation(
mediaid INTEGER REFERENCES media(id),
recordid INTEGER REFERENCES record(id),
archived BOOLEAN
);
INSERT INTO assosiation VALUES
(1,2001,true),
(1,2002,true),
(5,2002,false),
(1,2003,true),
(5,2003,true);
下面的psql返回预期值:
SELECT * FROM record r WHERE
true = ALL (
SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:
id | name
------+--------------
2001 | First record
2003 | Third record
(2 rows)
这可能是一个很好的方法,但对我来说似乎不起作用。我会改为尝试过的纯sql:选择*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False你能更具体一点吗?(包括您正在使用的错误跟踪/postgesql/jpa版本)@iXô在您的问题中提到“。当与媒体的每个关联都将存档属性设置为true时…”但是您没有提到所有关联记录都应该显示……您的意思正确吗?@iXô抱歉,是的,这就是我想要的,当所有关联都设置为achived=trueOk时,我想要记录。谢谢,如果一个记录与每种媒体关联,它会起作用,但是如果一个记录仅与媒体的子集关联,则无法显示此记录返回。也许通过调整第二个子选择我们可以实现这个,有什么想法吗?好的。请用输入的样本数据更改原始问题