2013-10-18 40 views
1

SQL初学者在这里。 我想将一个表(pgm_update)外连接到另外两个表(family和family_act_visits)。 pgm_update记录可以对应于家庭记录或family_act_visits记录或者都不对应;我的结果应该返回所有三种情况的数据。无论是一些糟糕的体系结构,连接必须位于多个列上。这些单个查询都可以工作,但我无法将它们组合成单个查询。SQL多个外部联接在多个字段上

SELECT p.last_name_wo, p.activity, p.participation, fav.* 
FROM family_act_visits fav 
RIGHT JOIN pgm_update p ON fav.folks_fk=p.folks_fk and fav.activity=p.activity 
    JOIN activities a on p.activity=a.activity 
WHERE p.participation in ('c','a') and a.act_start_date>current_date() 

SELECT p.last_name_wo, p.activity, p.participation, f.* 
FROM family f 
RIGHT JOIN pgm_update p ON f.folks_fk=p.folks_fk and f.activity=p.activity 
JOIN activities a on p.activity=a.activity 
WHERE p.participation in ('c','a') and a.act_start_date>current_date() 

我的一个在完整的查询尝试的是:

SELECT p.last_name_wo, p.activity, p.participation, fav.* 
FROM family_act_visits fav, family f 
RIGHT JOIN pgm_update p ON fav.folks_fk=p.folks_fk and fav.activity=p.activity 
RIGHT JOIN pgm_update p2 ON f.folks_fk=p2.folks_fk and f.activity=p2.activity 
JOIN activities a on p.activity=a.activity 
WHERE p.participation in ('c','a') and a.act_start_date>current_date() 

这得到错误信息 希望“‘关于条款’在未知列‘fav.folks_fk’”这个长的帖子包含了所有需要的信息....谢谢!

回答

0

首先,在多个条件下的JOIN并不表示设计不佳。

你确定你想要一个RIGHT JOIN?

也许你正在寻找LEFT JOIN

您的查询是有点复杂,它包括一个CROSS JOIN,也许是无意?

也许你只是想UNION ALL它允许您添加具有相同形状的数据集....

SELECT 
    p.last_name_wo 
    ,p.activity 
    ,p.participation 
    ,fav.* 
FROM 
    family_act_visits fav 
RIGHT JOIN pgm_update p 
    ON fav.folks_fk=p.folks_fk 
    AND fav.activity=p.activity 
JOIN activities a 
    ON p.activity=a.activity 
WHERE 
    p.participation IN ('c','a') 
    AND a.act_start_date>current_date() 
UNION ALL 
SELECT 
    p.last_name_wo 
    ,p.activity 
    ,p.participation 
    ,f.* 
FROM 
    family f 
RIGHT JOIN pgm_update p 
    ON f.folks_fk=p.folks_fk 
    AND f.activity=p.activity 
JOIN activities a 
    ON p.activity=a.activity 
WHERE 
    p.participation IN ('c','a') 
    AND a.act_start_date>current_date() 
+0

谢谢谢谢!那是最让我感动的地方。 – user2892588

+0

你可以upvote有用的答案,并接受解决您的问题的答案,谢谢。 – Matthew