是否有任何查询来查找此id信息?

5m1hhzi4  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(327)

她是我table上的一个样品:

+--------+-------+-----+
|  name  | value | id  |
+--------+-------+-----+
| value1 |     1 | 100 |
| value2 |     2 | 100 |
| value1 |     1 | 200 |
| value2 |     3 | 200 |
| value1 |     1 | 300 |
| value2 |     4 | 300 |
|        |       |     |
+--------+-------+-----+

如何设置sql查询来检索 id 给定值为100 value1 = 1 以及 value2 = 2 ?

roqulrg3

roqulrg31#

按id分组并在having子句中设置条件:

select id
from tablename
where (name, value) in (('value1', 1), ('value2', 2))
group by id
having count(distinct value) = 2

请看演示。

tez616oj

tez616oj2#

如果我理解正确的话 having 子句满足您的要求:

select id
from t
group by id
having count(*) filter (where name = 'value1' and value = 1) = 1 and
       count(*) filter (where name = 'value2' and value = 2) = 1 ;
hpcdzsge

hpcdzsge3#

关系分裂的例子。请参见:
如何在多通关系中过滤sql结果
此查询通常比目前所建议的效率更高:

SELECT id
FROM  (SELECT id FROM tbl WHERE name = 'value1' AND value = 1) t1
JOIN  (SELECT id FROM tbl WHERE name = 'value2' AND value = 2) t2 USING (id);

或等效项(导致相同的查询计划):

SELECT id
FROM   tbl t1
JOIN   tbl t2 USING (id)
WHERE  t1.name = 'value1' AND t1.value = 1
AND    t2.name = 'value2' AND t2.value = 2;

db<>在这里摆弄
不在查询中强制唯一性(像其他答案一样),因为我假设表中的一个或多个约束已经这样做了。
有一个“覆盖”索引 (name, value, id) . 优化的索引变化是可能的,这取决于您未公开的表定义。
但是如果你有能力改变你的关系设计,首先要重新考虑它。eav模型通常是次优的。请参见:
这个键值的数据库架构有名称吗?

sdnqo3pr

sdnqo3pr4#

从表\u name中选择id,其中值在(1,2)中;
当value列为1或2时,这将从表中检索id列

相关问题