【问题标题】:Conditional joining有条件加入
【发布时间】:2011-06-03 16:23:36
【问题描述】:

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

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

我尝试的第一件事是:

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

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

【问题讨论】:

  • 我喜欢你第二次尝试使用 coalesce。

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


【解决方案1】:

在我看来,如果你总是有一个帐号,那么你就是在倒退。您应该从 Account 表开始,然后加入其他表。

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

现在,如果您有多个机会或同一帐户的报价,这将为您提供多行。您可能需要左连接中的一些其他因素来将机会与报价联系起来。我不确定你的数据。

你正在替换嵌套视图的讨厌,这对你有好处。

【讨论】:

  • 您在此处尝试建议的内容看起来像是 OP 的第二个查询的 LEFT JOIN 两侧的反转,即您似乎在建议某种 A left join (O full join Q) 而不是 (O full join Q) left join A。我相信你知道这两者是不一样的。 (OQ,即使它们总是在 A 中有关联的项目,也可能无法覆盖 所有 A 的项目。)
  • 如果您想要所有帐户以及与之关联的报价/机会,这将是使用的方法。但它也会为您提供没有关联数据的帐户。
  • 嗯,OP是doing a full join on opportunity id...而且主选择中的别名也需要一些修复...
  • @HLGEM, 机会和报价应该总是有一个帐户,但由于这里的数据质量他们可能没有,所以从 a 到 (o 全外连接 q) 进行左连接不会显示我从完整的外部连接中获取所有内容,并且会给我与报价或机会无关的帐户,这不是我想要的。另外,我还有另一个表需要加入两者,我只是把它排除在外。
  • 好的,从@HLGEM 那里得到了一些灵​​感。我将报价和机会移动到派生表中,为帐户 ID 选择合并,然后对帐户表进行左连接。这似乎有效
【解决方案2】:

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

【讨论】:

  • 如果一个没有匹配商机的报价有一个对应的帐户,并且一个没有匹配报价的商机具有相同的对应帐户,那么无论您如何应用 DISTINCT,该帐户都会显示两次,除非您的意思是只检索帐户,否则我遗漏了一些东西。
  • @Andriy M DISTINCT 适用于单个列....因此您可能必须将其设为查询,然后将 DISTINCT 选择应用于该查询。我想知道您是否可以执行 SELECT DISTINCT a.AccountID FROM left outer join... 等等
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 2022-01-16
  • 2018-09-05
  • 2019-01-14
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
相关资源
最近更新 更多