sql - 创建在 SQL 中返回表的函数
问题描述
我想用一些逻辑来创建视图,比如使用 (for loop , if .. else) 但由于 SQL 不支持这种方式,所以我想创建不带参数并返回表的表函数。
我有一张orders
如下表
OrderId Destination Category Customer
----------------------------------------
6001 UK 5 Adam
6002 GER 3 Jack
下表tracking orders
如下
ID OrderID TrackingID
-----------------------
1 6001 1
2 6001 2
3 6002 2
这里是types of tracking
ID Name
--------------
1 Processing
2 Shipped
3 Delivered
正如您在 中看到的tracking order
,订单号可能有多个记录,具体取决于发生了多少跟踪事件。
我们有超过 25 种跟踪类型,我在这里没有包括在内。这意味着一个订单可以在tracking order
表中存在 25 次。
话虽如此,我的要求是创建如下视图,条件是订单必须属于 5 或 3 个类别(我们有超过 15 个类别)。
每当我运行该函数时,它必须返回更新的信息。
因此,例如,当发生新的跟踪并将其插入时tracking order
,我想运行我的函数并在相应的标志列(例如isDelivered
)中查看更新。
我真的很困惑什么是实现这一目标的最佳方法。我不需要确切的脚本,我只需要了解实现它的方法,因为我对 SQL 不是很熟悉
解决方案
它可以通过使用条件聚合的交叉表查询来完成。像这样的东西
select o.OrderID,
max(case when tt.[Name]='Processing' then 1 else 0 end) isPrepared,
max(case when tt.[Name]='Shipped' then 1 else 0 end) isShipped,
max(case when tt.[Name]='Delivered' then 1 else 0 end) isDelivered
from orders o
join tracking_orders tro on o.OrderID=tro.OrderID
join tracking_types tt on tro.TrackingID=tt.TrackingID
where o.category in(3, 5)
group by o.OrderID;
[编辑] 为了打破第 3 类订单,在交叉表中添加了 3 个附加列。
select o.OrderID,
max(case when tt.[Name]='Processing' then 1 else 0 end) isPrepared,
max(case when tt.[Name]='Shipped' then 1 else 0 end) isShipped,
max(case when tt.[Name]='Delivered' then 1 else 0 end) isDelivered,
max(case when tt.[Name]='Processing' and o.category=3 then 1 else 0 end) isC3Prepared,
max(case when tt.[Name]='Shipped' and o.category=3 then 1 else 0 end) isC3Shipped,
max(case when tt.[Name]='Delivered' and o.category=3 then 1 else 0 end) isC3Delivered
from orders o
join tracking_orders tro on o.OrderID=tro.OrderID
join tracking_types tt on tro.TrackingID=tt.TrackingID
where o.category in(3, 5)
group by o.OrderID;
推荐阅读
- java - How to show images with indirect link/URL using Glide
- python - Importing python modules from another directory
- css - How to use the bootstrap 4 SASS mixins with customization in Angular 7 without importing multiple bootstraps
- ruby-on-rails - How to implement Many-to-Many in Active Record models in Rails?
- tomcat - Tomcat 过滤器映射无法通过 ProxyPass
- serverless-framework - 使用无服务器框架时如何使用默认请求模板?
- c# - 我不知道我的 lambda 表达式做错了什么,有人可以纠正我吗?
- python - 在 python 中,如何反转二维字典?
- javascript - Node.js 6.10 十六进制->BASE64->UTF8
- unit-testing - 单元测试失败 (JUnit+Mockito) - 空指针异常