我有一个像这样的表结构
表1
PersonID, referrer
表2
Event_A_ID, PersonID, status
表3
Event_B_ID, PersonID, status
我想通过加入referrer=X
之类的所有事件表并检查PersonID,从具有Event_A...K
的表中获取每个人的事件状态。由于人们可以出现在多个事件中,所以我们可以遇到这样的情况
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, ...
但是我不确定如何联接所有事件表,因为ID可以重复(并且是需要的)。
我尝试单独选择并使用in
语法
...
WHERE 1=1
AND PersonID IN (SELECT PersonID from table1 where referrer=X)
但是后来我意识到之前的所有事情都是事件的汇总。
我应该从Table1中的SELECT开始吗?首先选择有效的ID,然后再从事件中选择?如果是这样,我如何加入?我觉得理想状态看起来像所有事件表的并集,然后选择
答案 0 :(得分:2)
您可以将union all用于数据的按行实现,或者如果表事件较少,还可以在表之间使用内部联接。这将以列格式表示数据。
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 :(得分:1)
使用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
答案 2 :(得分:0)
您可以使用左联接执行以下操作:
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'