首页 > 解决方案 > 判断内连接还是左外连接的条件语句?

问题描述

我有数百万多行的记录,在提供参数时我想要进行内部连接的表中,如果不进行基于过滤器的搜索。长期解决方案是拆分逻辑,但短期内我需要一些帮助。

我正在尝试执行以下操作:

params:
@movie_ids int_table (optional passing in a table of only ints here) 
@filter_name
@filter_genre
@filter_actor_name

DECLARE @id_count = sets movie id count here or 0; 

SELECT 
      m.Id
      m.Name
      m.ShortName
      m.Genre
      m.ImageUrl
FROM Movies m WITH(NOLOCK)
IF movie_ids <> 0 
  BEGIN
    INNER JOIN @movie_ids mids
      ON mids.id = m.Id
  END
ELSE 
  LEFT OUTER JOIN code_genres cg
    ON m.GenreId = cg.Id
  INNER JOIN Actors a
    ON a.name LIKE '%@filter_actor_name%'
END
WHERE m.Name LIKE '%filter_name%'
OR m.ShortName LIKE '%filter_name%'

抱歉,我不能提供实际的存储过程,因为我不是原作者。短期内我想弄清楚的问题是找出我是否可以做这个条件连接。

目前,它有一个带有 where 子句的 LEFT OUTER JOIN,它假设执行条件,但是它在过滤器发生之前返回的数据量太多 - 太慢了。像这里的东西

让我知道我是否可以提供更多详细信息。

(长期解决方案已完成 - 从 sql 中拆分逻辑,但我现在需要一些东西)

标签: sqlsql-serverif-statement

解决方案


正如 Programnik 提到的,您可以在此处使用动态 sql。你可以尝试这样的事情:

DECLARE @sql VARCHAR(1000) = '';

@sql = @sql + 'SELECT 
      m.Id
      m.Name
      m.ShortName
      m.Genre
      m.ImageUrl
FROM Movies m WITH(NOLOCK)';

IF movie_ids <> 0 
  BEGIN
    @sql = @sql + ' INNER JOIN @movie_ids mids
      ON mids.id = m.Id';
END
ELSE 
  @sql = @sql + ' LEFT OUTER JOIN code_genres cg
    ON m.GenreId = cg.Id
  INNER JOIN Actors a
    ON a.name LIKE' +'%@filter_actor_name%';
END

@sql = @sql + ' WHERE m.Name LIKE' + '%filter_name%';
@sql = @sql + ' OR m.ShortName LIKE' + '%filter_name%';

EXEC sp_executesql @sql

推荐阅读