Как присоединиться, где нужны дубликаты? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть такая структура таблицы

Table1

PersonID, referrer

Table2

Event_A_ID, PersonID, status

Таблица3

Event_B_ID, PersonID, status

Я хочу получить статус события для каждого из таблицы один с referrer=X, присоединив все таблицы событий, такие как Event_A...K и проверив PersonID. Поскольку люди могут появляться в нескольких мероприятиях, у нас могут быть такие случаи, как

PersonID=1001, EventA_ID, referrer=X, status
PersonID=1001, EventB_ID, referrer=X, status
PersonID=1001, EventK_ID, referrer=X, status
PersonID=1002, ...
PersonID=1003, ...

Но я не уверен, как присоединиться ко всем таблицам событий, так как идентификаторы могут быть дубликатами (и являются желательными).

Я пытался сделать отдельный выбор и использовать синтаксис in

...
WHERE 1=1
AND PersonID IN (SELECT PersonID from table1 where referrer=X)

Но потом я понял, что все прежде будет совокупностью событий.

Должен ли я начать с SELECT из таблицы 1? Сначала выберите действительные идентификаторы, а затем выберите из событий после? Если да, то как мне присоединиться? Я чувствую, что идеально выглядит как объединение всех таблиц событий, а затем выбираю

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

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

SELECT * FROM tb2 AS t2 INNER JOIN tb3 t3 ON t2.personId = t3.personId INNER JOIN tb1 t1 ON t1.personId = t2.personId WHERE t1.refer='refer1'

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

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

1 голос
/ 11 марта 2019

используйте union all, а затем примените join

select a.person_id,a.referrer,b.eventID,b.PersonID,b.status from Table1 a inner join
(
select Event_A_ID as eventID, PersonID, status from Table2
union all
select Event_B_ID as eventID, PersonID, status from Table3
)b on a.personid=b.personid
0 голосов
/ 11 марта 2019

Вы можете сделать что-то подобное с левыми соединениями:

SELECT t1.PersonID, t1.referrer, 
t2.Event_A_ID, t2.status as status_a, 
t3.Event_B_ID, t3.status as status_b
.
.
.
FROM table1 t1
LEFT JOIN table2 t2 ON t2.PersonID = t1.PersonID
LEFT JOIN table3 t3 ON t3.PersonID = t1.PersonID
.
.
.
WHERE t1.referrer = 'x'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...