sql - 判断内连接还是左外连接的条件语句?
问题描述
我有数百万多行的记录,在提供参数时我想要进行内部连接的表中,如果不进行基于过滤器的搜索。长期解决方案是拆分逻辑,但短期内我需要一些帮助。
我正在尝试执行以下操作:
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 中拆分逻辑,但我现在需要一些东西)
解决方案
正如 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
推荐阅读
- terraform - 将 Terraform 生命周期 ignore_changes 应用于工作区中的所有资源
- r - 如何用另一个相同维度的data.table的值替换一个data.table中的某个值
- python - 无法使用 python 解码这个字符串
- javascript - React 中的导入/导出
- solr - 使用 solr 的汇总报告
- google-analytics - 如何在 AMP 页面中获取用于谷歌分析的锚标记文本?
- postgresql - 如何通过坐标找到最近的父母或孩子?
- php - 联系表格提交无响应
- java - 我可以从静态代码外部“替换”Java 类吗?
- return - 是否可以在处理函数中返回形状(椭圆、矩形等)?