2013-10-18 60 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