Борьба с коррелированными подзапросами в SQL - PullRequest
0 голосов
/ 28 мая 2019

У меня есть база данных о старых автомобилях, их владельцах, событиях и сопровождающих этих событиях как таковых:

Изображение используемых таблиц:

Image of tables used

PK: первичный ключ FK: внешний ключ

Теперь мне нужно получить количество различных событий (eventId), которые посещал каждый участник (memberId).Важное примечание: у участника может быть несколько автомобилей, каждый из которых может посещать мероприятия.

Вот одна из моих попыток:

select m.memberId, count(a.eventId).
from members m where m.memberId in (select c.memberId from cars c where m.memberId =
    c.memberId and c.carId in
    (select d.carId from attendants a where c.carId = d.carId))
order by m.memberId

Я также пытался использовать объединения и группы, чтобы получитьправильный результат, но я никуда не доберусь.Кто-нибудь знает, как мне нужно сформировать подзапрос, чтобы я мог получить необходимые результаты?

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

Таким образом, вы хотите, чтобы отдельные события посетил участник. У участника есть автомобили, которые посещают события. Поскольку разные автомобили могут посещать одни и те же события, нужно отличаться от событий:

select m.memberId, count(distinct a.eventId)
from members m 
  join cars c on c.memberId = m.memberId
  join attendants a on a.carId = c.carId
group by m.memberId
0 голосов
/ 28 мая 2019

Не уверен, что вы используете именно это утверждение, но у вашего синтаксиса есть несколько проблем.Вы используете псевдонимы, которые не существуют (d.CarID - что такое таблица d?), И у вас нет оператора group by в конце, который сообщает движку, из каких столбцов вы хотите сохранить значения.Попробуйте что-то вроде этого:

select member_ID,
  count(*)
from (
  select distinct a.eventID, m.memberID
  from attendants a
  inner join cars c
  on a.carID = c.car_ID
  inner join members m
  on c.memberID = m.memberID
  group by a.eventID, m.memberID
)
group by memberID

Внутренний запрос получает то, что вы хотите - большой список всех участников, которые посетили автомобили, которыми они владеют, с дедупликацией, чтобы, если у них было две машины на одном мероприятииони записываются только один раз, что затем учитывается для каждого участника.

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