通过map中的几个键值对查找实体

问题描述 投票:0回答:1

我有以下两个表

office
office_attributes
,其中
office_attributes
包含
office
的键/值对。

办公室: |编号 |用户 ID | | --| -------- | | 1 | 1 | | 2 | 1 |

属性: |编号 |办公室 ID |关键|价值| | --| --------- | ---| -----| | 1 | 1 |一把钥匙|值1 | | 2 | 1 |另一把钥匙|值2 | | 3 | 2 |一把钥匙|值1 |

现在我想查询具有键/值对

a key/value1
another key/value2
的办公室,这应该只返回id为1的办公室,而不是id为2的办公室。

我现在使用

INTERSECT
创建了一个查询,但是对于这个问题有更好的解决方案吗?

SELECT * FROM "office" o WHERE o.id IN (
    SELECT o.id FROM "office" o LEFT JOIN "office_attributes" a WHERE a."key" = 'a key' AND a."value" = 'value1'
    INTERSECT
    SELECT o.id FROM "office" o LEFT JOIN "office_attributes" a WHERE a."key" = 'another key' AND a."value" = 'value2'
)
sql database performance jpa
1个回答
0
投票

您可以 JOIN office_attributes 两次 - 一次针对您要查找的每个键/值对。

小提琴

SELECT o.id
FROM office o
INNER JOIN office_attributes a1
  ON o.id = a1.office_id AND a1.key = 'a key' AND a1.value = 'value1'
INNER JOIN office_attributes a2
  ON o.id = a2.office_id AND a2.key = 'another key' AND a2.value = 'value2'
;

您提供的 INTERSECT 查询缺少连接条件,不确定是否是拼写错误,但 WHERE 之前需要一个 ON 条件。

    SELECT o.id FROM office o LEFT JOIN office_attributes a on o.id = a.office_id WHERE a.key = 'a key' AND a.value = 'value1'
    INTERSECT
    SELECT o.id FROM office o LEFT JOIN office_attributes a on o.id = a.office_id WHERE a.key = 'another key' AND a.value = 'value2'
;
© www.soinside.com 2019 - 2024. All rights reserved.