确定内部联接还是左外部联接的条件语句?

时间:2019-04-11 01:42:59

标签: sql sql-server if-statement

我有成千上万的记录行,在表中,如果没有提供基于过滤器的搜索,则希望在提供参数时进行内部联接。长期解决方案是分裂逻辑,但短期内我需要一些帮助。

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

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%'

抱歉,由于我不是原始编写者,所以我无法提供实际的存储过程。短期内我想找出的问题是找出是否可以执行此条件连接。

当前,它具有一个LEFT OUTER JOIN和一个where子句,该子句假设可以执行条件操作,但是在发生过滤器之前它返回的数据量太多-太慢。 Something like here

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

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

1 个答案:

答案 0 :(得分:1)

如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