sql - SQL Query 重复 `AND` 查询,如何避免?
问题描述
我在这里有这个查询:
DECLARE @date Date;
SET @date = '2020-11-24';
SELECT p.description AS ProductDescription,
SUM(CASE
WHEN p.code LIKE '%400' THEN requiredQty * 10
WHEN p.code LIKE '%400OL' THEN requiredQty * 10
WHEN p.code LIKE '%396' THEN requiredQty * 6
WHEN p.code LIKE '%396OL' THEN requiredQty * 6
WHEN p.code LIKE '%101' THEN requiredQty * 1
WHEN p.code LIKE '%101OL' THEN requiredQty * 1
WHEN p.code LIKE '%393OL' THEN requiredQty * 3
ELSE 0 END) AS RequiredQty,
'1kg' AS PackSize
FROM SalesOrderLine sol JOIN
SalesOrder so
ON sol.salesOrderID = so.id JOIN
Product p
ON sol.productID = p.id
WHERE
p.code like '%396' AND
so.dueDate = @date
OR
p.code like '%396OL' AND
so.dueDate = @date
OR
p.code like '%400' AND
so.dueDate = @date
OR
p.code like '%400OL' AND
so.dueDate = @date
OR
p.code like '%101' AND
so.dueDate = @date
OR
p.code like '%101OL' AND
so.dueDate = @date
OR
p.code like '%393OL' AND
so.dueDate = @date
GROUP BY p.description;
问题
我AND so.dueDate = @date
多次使用它来获得准确的数据。没有它,我将获得多年前的数据。
也许我的这个查询很啰嗦?有没有办法避免一遍又一遍地重复相同的查询?
解决方案
您可以通过多种方式简化查询:
SELECT p.description AS ProductDescription,
SUM(requiredQty * v.factor) as RequiredQty,
'1kg' AS PackSize
FROM SalesOrderLine sol JOIN
SalesOrder so
ON sol.salesOrderID = so.id JOIN
Product p
ON sol.productID = p.id JOIN
(VALUES ('%400', 10), ('%400L', 10),
('%396', 6), ('%396L', 6),
('%101', 1), ('%101L', 1),
('%393OL', 3)
) v(pattern, factor)
ON p.code LIKE v.pattern
WHERE so.dueDate = @date
GROUP BY p.description;
JOIN
负责过滤。
注意:由于LIKE
你的多次使用以及最多匹配一行的事实,我认为aboutJOIN
不会特别昂贵。CASE
但是您可以使用以下表达式替换逻辑APPLY
:
SELECT p.description AS ProductDescription,
SUM(requiredQty * v.factor) as RequiredQty,
'1kg' AS PackSize
FROM SalesOrderLine sol JOIN
SalesOrder so
ON sol.salesOrderID = so.id JOIN
Product p
ON sol.productID = p.id CROSS APPLY
(VALUES (CASE WHEN p.code LIKE '%400' THEN 10
WHEN p.code LIKE '%400OL' THEN 10
WHEN p.code LIKE '%396' THEN 6
WHEN p.code LIKE '%396OL' THEN 6
WHEN p.code LIKE '%101' THEN 1
WHEN p.code LIKE '%101OL' THEN 1
WHEN p.code LIKE '%393OL' THEN 3
END)
) v(factor)
WHERE so.dueDate = @date AND
f.factor IS NOT NULL
GROUP BY p.description;
推荐阅读
- java - 带有 3 个 select 语句的存储过程只返回一个表
- linux - UNIX:使用单个 find 命令搜索大于 4 MiB 的文件,然后将输出通过管道传输到排序命令
- google-apps-script - 使用 Google BigQuery / Apps 脚本为插入 Google 表格的数据添加时间戳
- reactjs - BootstrapTable 不接受 data={groupDetails?.group?.data?.contacts} 作为有效数据
- sql - 如何在PL / SQL中声明执行后输出参数(类型num_array)过程结果
- flutter - 如何使用 Stack 和 Positioned 使应用程序响应式 - Flutter
- javascript - 为什么 float left 不适用于最后一个元素?
- javascript - 有没有更好的方法来实现这一目标?
- javascript - 时间延迟后的开始间隔和按钮释放/反应停止
- python - How to print selected text from JSON file using Python