【问题标题】:SQL do inner join if condition met如果条件满足,SQL 执行内部连接
【发布时间】:2013-07-23 13:56:45
【问题描述】:

我想要一个改进我的 sql 代码的好方法,我必须在满足条件时使用内连接。我目前正在复制代码:

@SystemMerge bit

if (@SystemMerge=1)  
BEGIN
   SELECT
         .......
      FROM myTable
      INNER JOIN table ON table.param1=myTable.param1
      INNER JOIN systemTable on systemTable.param2=myTable.param2
   END
ELSE
   BEGIN
      SELECT
         .......
      FROM myTable
      INNER JOIN table ON table.param1=myTable.param1
   END

我想这样做:

@SystemMerge bit
BEGIN
   SELECT
      .......
   FROM myTable
   INNER JOIN table ON table.param1=myTable.param1
   ***//the next 4 lines is not working, but this pseudo of what i want:***
   if (@SystemMerge=1)  
   begin
      INNER JOIN systemTable on systemTable.param2=myTable.param2
   end

编辑: 解决方案(感谢@Damien_The_Unbeliever):

LEFT JOIN systemTable ON systemTable.param2=myTable.param2
WHERE 
   ((@SystemMerge=1 AND systemTable.param2 is not null) 
   OR
   (@SystemMerge=0 OR @SystemMerge is null))

【问题讨论】:

标签: sql sql-server


【解决方案1】:

如果我是对的,方法很简单 -

SELECT
    .......
FROM myTable
INNER JOIN table ON table.param1 = myTable.param1
INNER JOIN systemTable on @SystemMerge = 0 or systemTable.param2=myTable.param2  

【讨论】:

    【解决方案2】:

    动态sql怎么样?

    declare @sel varchar(max)
    
    set @sel = ' SELECT
             .......
             FROM myTable
             INNER JOIN table ON table.param1=myTable.param1
            '
    
     if (@SystemMerge=1)  
       begin
         set @sel = @sel+'INNER JOIN systemTable on systemTable.param2=myTable.param2'
       end
    
    exec(@sel)
    

    【讨论】:

      【解决方案3】:

      这应该(大约)做同样的事情:

      SELECT
           .......
        FROM myTable
        INNER JOIN table ON table.param1=myTable.param1
        LEFT JOIN systemTable on systemTable.param2=myTable.param2 and @SystemMerge = 1
        WHERE (@SystemMerge = 0 OR systemTable.NonNullableColumn IS NOT NULL)
      

      当然,这也意味着对systemTable 中列的任何其他引用都必须写入以期望这些列是NULL

      【讨论】:

      • 对我的情况没有帮助,但我会保留您的答案以备将来需要。谢谢。
      • 好的,我已经改进了答案,现在效果很好。谢谢。选了你。
      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2019-04-29
      • 2018-12-21
      • 2016-12-17
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多