Двойной фильтр объединенных таблиц с уникальными значениями и значениями, соответствующими определенной строке - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть две таблицы:

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: значение для element с идентификатором 1
  • Столбец B: значение для element с идентификатором 2
  • Столбец C: eventuid

Ограничения: только отображениестрока, если -

  1. value для elementid=1 уникальна в таблице values, т. е. нет eventuid s с таким же значением для того же elementid = 1
  2. value для elementid=2 равно true.

Моя попытка была сначала создать представление:

create view unique_event as
select distinct e.eventuid, count(v.value)
from events e
join values v on e.eventid = v.eventid
where v.elementid = 1
group by e.eventuid
having count(v.value) = 1;

Это, похоже, недля правильной работы, чтобы возвращать только отличные eventuid s - - почему-то это не отфильтровывает дубликаты (как указано выше).

Каков наилучший способ достижения поставленной цели?Есть ли лучший способ, чем иметь отдельный вид?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

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.
0 голосов
/ 06 декабря 2018

Один метод использует 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
                ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...