基于参数在另一个表上进行条件左连接

时间:2017-03-08 23:09:11

标签: sql sql-server-2008 tsql

我有一个使用交叉应用和复杂列的长连接。我有一个名为@NonCAT的参数。如果此参数等于" NonCAT"我希望我的第四个和第五个左连接加入另一个表。起初,我想也许有办法在那里放一个if语句。如:

if @NonCAT = 'NonCAT'
   begin
     left join (column1, column2, column3,
                from a_completely_different_table
                where reportmonth = @currentmonth
               )
      left join (column1...
                 from the_same_table_as_above
                 where reportmonth = @previousmonth
                )
else if @NonCAT <> 'NonCat'
       begin
          left join (column1....
                     from_a_different_table_as_above....

我在这里有道理吗?任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

您对单个查询的距离最近:

from a left join
     b
     on . . . and @NonCat = 'NonCat' left join
     c
     on . . . and @NonCat <> 'NonCat'

即,将条件移到on子句中。您正在使用left join,所以这很好。

当然,您可以编写整个查询两次并使用if。或者,使用动态SQL构造单个查询。

答案 1 :(得分:0)

不同的方法可能不是使用条件连接,而是使用CASE WHEN ... THEN ... ELSE...END(可以有多个WHEN)选择的内容。)

SELECT CASE WHEN @NonCAT = 'NonCAT'
            THEN t1.column1
            ELSE t2.column1
             END AS column1,
       CASE WHEN @NonCAT = 'NonCAT'
            THEN t1.column2
            ELSE t2.column2
             END AS column2,
       CASE WHEN @NonCAT = 'NonCAT'
            THEN t1.column3
            ELSE t2.column3
             END AS column3
  FROM mainTable AS mt
  LEFT OUTER JOIN (
               SELECT column1, column2, column3,
                 FROM a_completely_different_table
                WHERE reportmonth IN(@currentmonth, @previousmonth)
       ) AS t1 ON t1.somecol = mt.somecol
  LEFT OUTER JOIN (
               SELECT column1, column2, column3,
                 FROM from_yet_a_completely_different_table
                WHERE [conditions]
       ) AS t2 ON t1.somecol = mt.somecol