我有两个表:
values
表:
eventid | elementid | value
-------------------------------
10 | 1 | 1234
11 | 1 | 5678
12 | 1 | 5678
10 | 2 | true
11 | 2 | true
因此,values
表可以为同一elementid
具有多个值。
events
表:
eventid | eventuid
-------------------
10 | abcdef
11 | ghijkg
12 | vwxyz
我的目标是建立一个可显示的查询
value | value | eventuid
-----------------------------
true | 1234 | abcdef
element
的{{1}}的值1
的{{1}}的值约束:仅在--
时显示一行element
的{{1}}在2
表中是唯一的,即对于相同的value
= {{ 1}} elementid=1
的{{1}}是values
。我的尝试是先创建一个视图:
eventuid
这似乎不能正常工作,仅返回不同的elementid
--不知何故,它不能过滤出重复项(如上所述)。
达到既定目标的最佳方法是什么? 有没有比单独查看更好的方法了?
答案 0 :(得分:1)
一种方法使用exists
和not exists
:
create view unique_event as
select v.eventuid
from values v
where v.elementid = 1 and
not exists (select 1
from values v2
where v2.value = v.value and v2.elementid = 1 and v2.eventuid <> v2.eventuid
) and
exists (select 1
from values v2
where v2.value = 'true' and v2.elementid = 2 and v2.eventuid = v.eventuid
) ;
答案 1 :(得分:1)
SELECT
true as value1,
MIN(value) FILTER (WHERE elementid = 1) as value2, -- 3
eventid
FROM
values
WHERE eventid IN (
SELECT -- 1
MIN(eventid)
FROM values
WHERE elementid = 1
GROUP BY value
HAVING COUNT(eventid) = 1
)
GROUP BY eventid
HAVING MIN(value) FILTER (WHERE elementid = 2) = 'true' -- 2
eventid
的值恰好存在一次的elementid = 1
elementid = 2
的值为'true'
的所有行。FILTER
子句透视结果。