Как выбрать значения столбца, только если значения существуют в другом столбце в SQL? - PullRequest
0 голосов
/ 13 ноября 2018

У меня немного сложный вопрос.Есть несколько столбцов.По сути, логика в том, что есть куча заголовков.Каждый заголовок имеет уникальный идентификатор, и они являются частью серии.Как видно из «Таблицы сейчас», есть несколько разных гоблинов: гоблины, гоблины 2 и гоблины 3. Они имеют отдельные уникальные идентификаторы, если они являются разными заголовками, но, поскольку они все гоблины, они имеют уникальный идентификатор серии.Эти титулы / существа могут иметь любой дом.Но Саурон владеет только теми, кто находится в Логове.

Я хотел бы выяснить, какой процент владения Саурона уникален для Саурона по сравнению с чем-то еще, принадлежащим другому человеку.Так, например, вампиры принадлежат Саурону так же, как никто другой.Если Саурону принадлежит уникальный идентификатор серии, то я хочу его.

То, как я собирался заняться этим, - найти все, что принадлежит Саурону.Основываясь на уникальном идентификаторе серии того, что принадлежит Саурону, я бы хотел найти все в таблице.На данный момент уникального идентификатора серии очень мало, поэтому его легко набрать вручную, например, уникальный идентификатор серии = 'Gob', но если бы их было много, как бы я поступил?Я хочу найти все, что принадлежит Саурону, и все совпадения уникального идентификатора серии, которым владеет и Саурон.Так что таких вещей, как Монстры и Тролли, не принадлежащие Саурону, нет.И воображая, что эта таблица - миллион или больше, а не небольшой набор вещей.

Цените любую помощь и извините за словесный приступ, не мог придумать лучшего способа объяснить это!: D

Пример таблицы для демонстрации

image

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Выберите все уникальные идентификаторы серии для Sauron.Затем выберите все заголовки с этими уникальными идентификаторами серии.

select * from mytable 
where unique_series_identifier in 
(
  select unique_series_identifier
  from mytable
  where evil_lord = 'Sauron'
)
order by unique_series_identifier, unique_identifier;

Я предлагаю иметь следующие индексы для этого запроса.Один для поиска названий Saurons, другой для поиска названий по уникальному идентификатору серии.

create index idx1 on mytable ( evil_lord, unique_series_identifier );
create index idx2 on mytable ( unique_series_identifier );
0 голосов
/ 13 ноября 2018

Вы хотите "заголовки", у которых есть хотя бы один "Саурон". Если это так, вы можете использовать оконные функции:

select t.*
from (select t.*,
             sum(case when evillord = 'Sauron' then 1 else 0 end) over (partition by title) as num_saurons
      from t
     ) t
where num_saurons > 0;
...