我有以下两个表
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'
)
您可以 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'
;