SQL Join возвращает дублированный результат запроса - PullRequest
2 голосов
/ 22 сентября 2019

Я использую SQLite.У меня есть 2 таблицы, одна - список работников на мероприятии, с идентификатором события и подробностями события.Другая таблица содержит сведения об отсутствующих работниках, а также идентификатор события, на котором они должны были присутствовать.

Я хочу вернуть историю отсутствия работника (из таблицы «Отсутствует») и включить сведения о событии, полученные от любого из присутствующих работников.на этом событии (из таблицы Events).

Я возвращаю то, что хочу, однако строки дублируются количеством рабочих на этом событии.Итак, если работник Джон отсутствовал в событии 100, где было 3 работника, запрос мог бы вернуть:

John, Event 100, Event 100 Details
John, Event 100, Event 100 Details
John, Event 100, Event 100 Details

запрос:

 SELECT mm.WorkerID, mm.EventID, ar.EventDetails FROM AbsentTable AS mm  
 LEFT JOIN EventsTable AS ar 
 ON mm.EventID = ar.EventID 
 WHERE mm.WorkerID = :WorkerID

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

1 Ответ

1 голос
/ 23 сентября 2019

У меня есть 2 таблицы, одна из них список работников на мероприятии, с идентификатором события и подробностями события .

Проблема в том, что EventsTable содержит несколько записей для каждого события.Ваше объединение возвращает столько записей, сколько было работников на этом мероприятии.

Одним из решений было бы использование подзапроса, который выбирает значения DISTINCT, в которых вы заинтересованы, из EventsTable, а затем присоедините его к AbsentTable.

SELECT mm.WorkerID, mm.EventID, ar.EventDetails 
FROM AbsentTable AS mm  
LEFT JOIN (SELECT DISTINCT EventID, EventDetails FROM EventsTable) AS ar 
    ON mm.EventID = ar.EventID 
WHERE mm.WorkerID = :WorkerID

Итог: у вас проблема с дизайном.Одна и та же информация (данные evet, идентификатор события) повторяется для нескольких записей в EventsTable.Было бы лучше иметь отдельную таблицу для хранения событий (по одной записи на событие), а затем ссылаться на первичный ключ этой таблицы в таблице, которая отслеживает присутствие каждого работника в каждом событии.

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