【问题标题】:Use IF to identify what inner join should i used使用 IF 来确定我应该使用什么内部联接
【发布时间】:2016-09-02 07:56:08
【问题描述】:

我有一个这样的存储过程

Select Name, Identifier, ReferenceId, ReferenceAccountId
FROM Test

在开始内部连接之前,我有一个名为 Identifier 的字段。 如果 This 为 1,那么我将使用内部连接 ​​ref_reference1 否则我将使用另一个。

INNER JOIN Ref_Reference1 ON Ref_Reference1.ReferenceId = Test.ReferenceId
INNER JOIN Ref_Reference2 ON Ref_Reference2.ReferenceId = Test.ReferenceId

我该如何解决这个问题?

【问题讨论】:

    标签: .net sql-server vb.net stored-procedures


    【解决方案1】:

    你没有。如果不使用动态 SQL,则无法更改查询的“形状”,通常应尽可能避免这种情况。

    相反,您可以进行两个左连接:

    LEFT JOIN Ref_Reference1 ON
         Ref_Reference1.ReferenceId = Test.ReferenceId
         AND Test.Identifier = 1
    LEFT JOIN Ref_Reference2 ON
         Ref_Reference2.ReferenceId = Test.ReferenceId
         AND Test.Identifier <> 1
    

    您会注意到您现在还有一个很大的好处 - 您可以在查询的其他地方引用这些表格(您打算如何在您的提案中处理这些表格?)

    【讨论】:

      【解决方案2】:

      您可以尝试 2 个带条件的左连接并检查

      Select 
          Name, Identifier, ReferenceId, ReferenceAccountId,
          ISNULL(Ref_Reference1.ReferenceId,Ref_Reference2.ReferenceId)
      FROM Test
      LEFT OUTER JOIN Ref_Reference1 ON Ref_Reference1.ReferenceId = Test.ReferenceId AND Identifier = 1
      LEFT OUTER JOIN Ref_Reference2 ON Ref_Reference2.ReferenceId = Test.ReferenceId AND Identifier <> 1
      

      【讨论】:

      • 在这个答案中我使用了 ISNULL 。 . .并将其提供给达米安的asnwer。然后我的查询效果很好。感谢您的努力。上帝保佑先生:)
      【解决方案3】:

      我认为你想要的语言中没有任何东西允许它。但是,如果两个结果的结构相同,则可以存储中间结果;

      if ...
        select ...
        into #result
        from ... join reference1 
      else
        select ...
        into #result
        from ... join reference2
      

      但这并不好......

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 2017-05-27
        相关资源
        最近更新 更多