【问题标题】:sql multiple outer joins on multiple fieldssql多个字段上的多个外连接
【发布时间】:2013-10-26 16:36:44
【问题描述】:

这里是 SQL 初学者。 我正在尝试将一个表(pgm_update)外部连接到另外两个表(family 和 family_act_visits)。一个 pgm_update 记录可以对应一个家庭记录或一个 family_act_visits 记录,或者两者都不对应;我的结果应该返回所有三种情况的数据。这两种架构都不好,连接必须在多个列上。这些单独的查询中的每一个都有效,但我无法将它们组合成一个查询。

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()

这会收到错误消息“'on 子句'中的未知列'fav.folks_fk'” 希望这篇长文包含所有需要的信息....谢谢!

【问题讨论】:

    标签: sql outer-join


    【解决方案1】:

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

    你确定要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()
    

    【讨论】:

    • 您可以为有用的答案投票并接受可以解决您的问题的答案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2010-09-07
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多