Получить пользовательские данные таблицы - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть сценарий, в котором у меня есть три таблицы custom_tables, custom_fields и custom_field_values, в которых условие множественной фильтрации будет применяться к значениям, хранящимся в custom_field_values. У нас есть entity_id в custom_field_values, который является уникальным идентификатором для идентификации каждой строки, в простом слове entity_id представляет одну строку в обычных таблицах. Вот таблица с примером:

enter image description here enter image description here enter image description here

Теперь я иметь условие, которое говорит age > 25, в этом случае это только удалить 3-ю строку в таблице custom_field_values, в то время как я хочу удалить целые записи с таким же примером entity_id в custom_field_values 3-й строке не соответствует нашему условию, и его entity_id равен 12345, поэтому я хочу отменить выбор всей записи с этим entity_id, и я ожидаю, что результат будет примерно таким:

enter image description here

У меня возникли проблемы с достижением этого, я ищу какой-нибудь обобщенный c и самый быстрый способ добиться этого, поскольку в пользовательских таблицах может быть более 1 миллиона записей, может кто-нибудь помочь ... пожалуйста ...

1 Ответ

0 голосов
/ 02 апреля 2020

Это ужасный дизайн , и что бы вы ни делали, оно не будет быстрым, особенно с ожидаемым количеством строк, а обслуживание будет кошмаром и ошибкой склонный. Лучше всего сделать редизайн, чтобы получить 1 стол. Поскольку я понятия не имею, для чего служит таблица функций custom_tables, я просто использую остальные. Таким образом, только с двумя другими у вас будет:

create table custom_tables (
             id            bigserial 
           , entity_id     text        -- or integer/bigint if appropriate
           , name          text
           , age           integer
           ) ;

Если вы останетесь с этим (бессмысленным) дизайном, то, по крайней мере, создайте представление, которое по существу отображается в приведенную выше таблицу; или лучше материализованное представление следующим образом:

create or replace view custom_tables_set as
   with id_fld as 
         ( select cfv.entity_id, cfv.value id
              from custom_field_values cfv
              left join custom_fields  cf  on(cf.id = cfv.custom_field_id)
             where cf.alias = 'id'
          ) 
       , name_fld as
         ( select cfv.entity_id, cfv.value as name 
              from custom_field_values cfv
              left join custom_fields  cf  on(cf.id = cfv.custom_field_id)
             where cf.alias = 'name'
          )  
       , age_fld as  ( select cfv.entity_id, cfv.value age  
              from custom_field_values cfv
              left join custom_fields  cf  on(cf.id = cfv.custom_field_id)
             where cf.alias = 'age'
          )  
   select i.entity_id, i.id, n.name, a .age 
     from id_fld  i 
     left join name_fld n on n.entity_id = i.entity_id
     left join age_fld  a on a.entity_id = i.entity_id ;  

Вам нужно будет добавить другое .._fld CTE для каждого создаваемого вами значения псевдонима.
По крайней мере, с представлением вы не будете присоединяться к каждому написанному запросу.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...