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+'您的字符串'