使用IF来识别我应该使用哪个内连接

时间:2016-09-02 07:56:09

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

我有一个像这样的存储过程

Select Name, Identifier, ReferenceId, ReferenceAccountId
FROM Test

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

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

你没有。如果不使用动态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

您会注意到您现在也有很大的好处 - 您可以在查询的其他位置引用这些表格(您打算如何处理提案中的内容?)

答案 1 :(得分:3)

您可以尝试使用条件进行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

答案 2 :(得分:2)

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

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

但这不好......