具有唯一值和与特定字符串匹配的值的双过滤联接表

时间:2018-12-06 12:06:42

标签: sql postgresql join

我有两个表:

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
  • A列:ID为element的{​​{1}}的值
  • B列:ID为1的{​​{1}}的值
  • C列:事件

约束:仅在--

时显示一行
  1. element的{​​{1}}在2表中是唯一的,即对于相同的value = {{ 1}}
  2. elementid=1的{​​{1}}是values

我的尝试是先创建一个视图:

eventuid

这似乎不能正常工作,仅返回不同的elementid--不知何故,它不能过滤出重复项(如上所述)。

达到既定目标的最佳方法是什么? 有没有比单独查看更好的方法了?

2 个答案:

答案 0 :(得分:1)

一种方法使用existsnot 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)

demo:db<>fiddle

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
  1. 获取所有eventid的值恰好存在一次的elementid = 1
  2. 过滤elementid = 2的值为'true'的所有行。
  3. 使用FILTER子句透视结果。