有条件的加入

时间:2011-06-03 16:23:36

标签: sql sql-server-2005 sql-server-2008 join

我正在处理一些嵌套视图,将它们合并到一个视图中。在统一视图中,我有一个机会表和一个引号表,我正在对机会ID进行完全加入,以便我获得所有报价,所有机会以及相关联的。

现在,有趣的是,我有一个名为帐户的表,我需要加入。看到并非所有机会都有报价,反之亦然,我需要一个很好的方式加入到桌面以获得账户,无论如何(理论上,如果有机会和报价他们应该拥有相同的帐户)。为了保持一致性,如果两者都存在,我想使用报价中的数据。

我尝试的第一件事是:

left outer join dbo.Accounts a
on q.AccountID=a.AccountID
or o.AccountID=a.AccountID

现在我遇到的问题是,如果我同时拥有引用和机会,它似乎会返回多行,而这不是我想要的。

第二次尝试我想出了这个:

left outer join dbo.Accounts a
on coalesce(q.AccountID,o.AccountID)=a.AccountID

这似乎给了我准确的结果,但我很好奇是否有更好的方法来获得我想要的东西而不会导致连接中的函数。

2 个答案:

答案 0 :(得分:2)

在我看来,如果你总是有一个帐号,你就是在向后工作。你应该从Acoount表开始,然后离开加入其他人。

SELECT a.accountid, OQ.somefield, OQ.someotherfield
FROM   
    (Select coalesce (o.AccountID, q.AccountID) as AccountID,
            q.somefield, o.someotherfield
    FROM Opportunity o 
    FULL JOIN Quote q 
        ON q.opportunityId = a.opportunityId) OQ
LEFT JOIN Accounts A
    ON OQ.AccountID = A.AccountId

如果您拥有同一帐户的多个商机或报价,现在已授予此权限会为您提供多行。您可能还需要左连接中的其他一些因素来将机会与报价相关联。我不确定你的数据。

对你有好处,你正在取代嵌套视图的肮脏。

答案 1 :(得分:0)

在查询中使用关键字DISTINCT。它仅返回唯一条目。因此,您的帐户只应出现一次。