如何组合多个同质表

时间:2015-03-30 13:07:46

标签: sql postgresql self-join

我想知道我将如何一起加入以下表格,我在两个收集年份中提出了两个问题。我想整理结果。请注意,followUp对于表中的每个人都是不变的。

Q1YR1
SubjectNo FollowUp  Response
1         1         Yes
2         1         No

Q2YR1
SubjectNo FollowUp  Response
1         1         No
2         1         Yes

Q2YR2
SubjectNo FollowUp  Response
1         2         Yes
2         2         Yes

Q2YR2
SubjectNo FollowUp  Response
1         2         No
2         2         No

我试图了解以下内容:

SubjectNo FollowUp Q1YR1 Q2YR1 Q1YR2 Q2YR2
1         1        Yes   No
1         2                    Yes   No
2         1        No    Yes
2         2                    Yes   No

到目前为止,我已经采用了表格的结合:

(SELECT subjectno_0 AS SubjectNo, aiw_0 AS Age, followup_0 AS FollowUp, dataresponse_0 AS Q1YR1, NULL AS Q2YR1, NULL AS Q1YR2, NULL AS Q2YR2 FROM question1yr1)
UNION ALL
(SELECT subjectno_0 AS SubjectNo, aiw_0 AS Age, followup_0 AS FollowUp, NULL AS Q1YR1, dataresponse_0 AS Q2YR1, NULL AS Q1YR2, NULL AS Q2YR2 FROM question2yr1)
UNION ALL
(SELECT subjectno_0 AS SubjectNo, aiw_0 AS Age, followup_0 AS FollowUp, NULL AS Q1YR1, NULL AS Q2YR1, dataresponse_0 AS Q1YR2, NULL AS Q2YR2 FROM question1yr2)
UNION ALL
(SELECT subjectno_0 AS SubjectNo, aiw_0 AS Age, followup_0 AS FollowUp, NULL AS Q1YR1, NULL AS Q2YR1, NULL AS Q1YR2, dataresponse_0 AS Q2YR2 FROM question2yr2)

这让我走了一半,但显然没有加入SubjectNo和FollowUp的回复。我尝试过自我加入,但我似乎无法做到这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这种情况的问题是找到所有主题编号和存在的后续内容的集合。如果您知道那是什么(假设它是一个名为subjectnumber的表),这是一个简单的左连接:

SELECT SN.SubjectNo, SN.FollowUp,
  Q1YR1.Response AS Q1YR1,
  Q2YR1.Response AS Q2YR1, 
  Q1YR2.Response AS Q1YR2,
  Q2YR2.Response AS Q2YR2
FROM SubjectNumber SN
LEFT JOIN Q1YR1 ON SN.SubjectNo = Q1YR1.SubjectNo AND SN.FollowUp = Q1YR1.FollowUp
LEFT JOIN Q2YR1 ON SN.SubjectNo = Q2YR1.SubjectNo AND SN.FollowUp = Q2YR1.FollowUp 
LEFT JOIN Q1YR2 ON SN.SubjectNo = Q1YR2.SubjectNo AND SN.FollowUp = Q1YR2.FollowUp
LEFT JOIN Q2YR2 ON SN.SubjectNo = Q2YR2.SubjectNo AND SN.FollowUp = Q2YR2.FollowUp

如果您没有这些主题编号表中的一个,那么您必须使用这样的联合从事件表中创建一个:

SELECT SN.SubjectNo, SN.FollowUp,
  Q1YR1.Response AS Q1YR1,
  Q2YR1.Response AS Q2YR1, 
  Q1YR2.Response AS Q1YR2,
  Q2YR2.Response AS Q2YR2
FROM (
  SELECT SubjectNo, FollowUp FROM Q1R1 UNION
  SELECT SubjectNo, FollowUp FROM Q2R1 UNION
  SELECT SubjectNo, FollowUp FROM Q1R2 UNION
  SELECT SubjectNo, FollowUp FROM Q2R2 
) SN
LEFT JOIN Q1YR1 ON SN.SubjectNo = Q1YR1.SubjectNo AND SN.FollowUp = Q1YR1.FollowUp
LEFT JOIN Q2YR1 ON SN.SubjectNo = Q2YR1.SubjectNo AND SN.FollowUp = Q2YR1.FollowUp 
LEFT JOIN Q1YR2 ON SN.SubjectNo = Q1YR2.SubjectNo AND SN.FollowUp = Q1YR2.FollowUp
LEFT JOIN Q2YR2 ON SN.SubjectNo = Q2YR2.SubjectNo AND SN.FollowUp = Q2YR2.FollowUp