sql - 有没有更好的方法来编写这个粗略的 SQL?
问题描述
因此,我正在为可能具有多个可选过滤器的报告创建查询。为了简单起见,我在这里只包括了客户端和站点。这些选项中的每一个都可以是包含或排除,并且可以包含 NULL、1 或多个值。因此,在将 varchar 加入查询之前,我将其拆分为一个表。
这个测试大约需要 15 分钟才能执行,这...只是不会做 :p 有更好的方法吗?我们有用动态 sql 编写的类似查询,我试图避免这种情况,但也许没有办法解决这个问题?
DECLARE
@ClientsInc VARCHAR(10) = 'ABCD, EFGH',
@ClientsExc VARCHAR(10) = NULL,
@StationsInc VARCHAR(10) = NULL,
@StationsExc VARCHAR(10) = 'SomeStation'
SELECT *
INTO #ClientsInc
FROM dbo.StringSplit(@ClientsInc, ',')
SELECT *
INTO #ClientsExc
FROM dbo.StringSplit(@ClientsExc, ',')
SELECT *
INTO #StationsInc
FROM dbo.StringSplit(@StationsInc, ',')
SELECT *
INTO #StationsExc
FROM dbo.StringSplit(@StationsExc, ',')
SELECT [some stuff]
FROM media_order mo
LEFT JOIN #ClientsInc cInc WITH(NOLOCK) ON cInc.Value = mo.client_code
LEFT JOIN #ClientsExc cExc WITH(NOLOCK) ON cExc.Value = mo.client_code
LEFT JOIN #StationsInc sInc WITH(NOLOCK) ON sInc.Value = mo.station_name
LEFT JOIN #StationsExc sExc WITH(NOLOCK) ON sExc.Value = mo.station_name
WHERE ((@ClientsInc IS NOT NULL AND cInc.Value IS NOT NULL)
OR (@ClientsExc IS NOT NULL AND cExc.Value IS NULL)
)
AND ((@StationsInc IS NOT NULL AND sInc.Value IS NOT NULL)
OR (@StationsExc IS NOT NULL AND sExc.Value IS NULL)
)
解决方案
首先,在这种情况下,我总是倾向于提到Erland Sommarskog 的动态搜索条件。
但是,您似乎已经意识到了两种选择:一种是动态 SQL。另一种通常是老把戏and (@var is null or @var=respective_column)
。但是,此技巧仅适用于每个变量的一个值。
您的解决方案确实似乎适用于多个值。但在我看来,你太努力避免动态sql了。您的要求足够复杂以保证它。请记住,通常情况下,动态 sql 对您来说更难编写代码,但在复杂情况下对服务器来说更容易 - 这当然是。进行性能猜测总是有风险的,但我想在这种情况下会有所改进。
推荐阅读
- python - 如何导出带有 utf-8 错误的串联 csv
- jmeter - jmeter 执行与 Jenkins 中先前构建的比较
- marklogic - xdmp:email 和 AWS SES
- c# - ASP.NET Core SaveChangesAsync 不会保存所有内容
- memory - 为什么删除 sed 中的一行会占用内存?
- html - 根据另一个元素的宽度定位元素
- javascript - 如何从 Excel 桌面关闭使用 OfficeRuntime.displayWebDialog 创建的对话框?
- reactjs - 如何在 React 中传递参数和 Input 的目标?
- javascript - 是否可以在调用 next 之前等待调用 ofType 运算符中的所有操作?
- javascript - 使用 reactjs 将多个 Base64 解码的 pdf 合并为一个 pdf