Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 确定内部联接或左外部联接的条件语句?_Sql_Sql Server_If Statement - Fatal编程技术网

Sql 确定内部联接或左外部联接的条件语句?

Sql 确定内部联接或左外部联接的条件语句?,sql,sql-server,if-statement,Sql,Sql Server,If Statement,我在一个表中有数百万行以上的记录,当提供参数时,如果不进行基于过滤器的搜索,我想进行内部连接。长期的解决办法是分裂逻辑,但短期内我需要一些帮助 我试着做如下的事情: 参数: @movie_ids int_table(此处可选择传入仅包含int的表) @过滤器名称 @过滤体裁 @过滤器\参与者\名称 声明@id\u count=在此处设置电影id计数或0; 选择 m、 身份证 m、 名字 m、 短名 m、 体裁 m、 图像URL 来自电影《我与(诺洛克)》 如果电影ID为0 开始 内部连接@mov

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

我试着做如下的事情:

参数:
@movie_ids int_table(此处可选择传入仅包含int的表)
@过滤器名称
@过滤体裁
@过滤器\参与者\名称
声明@id\u count=在此处设置电影id计数或0;
选择
m、 身份证
m、 名字
m、 短名
m、 体裁
m、 图像URL
来自电影《我与(诺洛克)》
如果电影ID为0
开始
内部连接@movie_ids mids
中间id=中间id
终止
其他的
左外连接代码\u类型cg
关于m.GenreId=cg.Id
内接演员a
在“%@filter\u actor\u name%”这样的.name上
终止
其中m.Name像“%filter\u Name%”
或类似“%filter\u name%”的m.ShortName
很抱歉,我无法提供实际的存储过程,因为我不是原始编写者。短期内,我想弄清楚的问题是,我是否能做到这一点

目前,它有一个左外部连接,其中包含一个where子句,该子句假设执行条件连接,但在筛选器出现之前返回的数据量太多-太慢

如果我能提供更多细节,请告诉我


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

正如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
DECLARE@sql VARCHAR(1000)='';
@sql=@sql+'选择
m、 身份证
m、 名字
m、 短名
m、 体裁
m、 图像URL
来自电影《我与(诺洛克)》;
如果电影ID为0
开始
@sql=@sql+'内部连接@movie\u ids mids
在mids.id=m.id';
终止
其他的
@sql=@sql+'左外连接代码\u类型cg
关于m.GenreId=cg.Id
内接演员a
在像'+'%@filter_actor_name%'这样的.name上;
终止
@sql=@sql++,其中m.Name类似于'+'%filter_Name%';
@sql=@sql+'或类似'+'%filter_name%'的m.ShortName;
EXEC sp_executesql@sql

我认为不可能做你想做的事。在过去,对于这种类型的问题,我在筛选表上使用左连接,并在where子句中执行类似where的操作(@param为null或filtertable.col=@param),但这会造成缓慢的查询计划。最好的选择是动态sqlNolock并不是“免费”的魔法——它的使用会带来后果。所以,在你了解这些后果之前,不要使用它。Erland讨论了许多不同的方法来解决此问题+=在SQL中不支持,请使用SQL=SQL+'您的字符串'