MS SQL Server 关联查询语句优化

满庭花醉三千客 2019-02-28 10:06:42
表之间存在关联'关联编号',三张表每张表数据量均为100万左右

1、Name当表2存在数据时取表2否则取表1;
2、BillNo当表3存在数据时取表3,当表2存在数据时取表2,最后才考虑表1;
除了索引优化之外,还有什么更好的优化方案(临时表、UNION ALL)?

简化例子如下(实际查询字段更多、关联表更多):

SELECT Id,关联编号,Name,BillNo FROM table1
SELECT Id,关联编号,Name,BillNo FROM table2
SELECT Id,关联编号,Name,BillNo FROM table3

SELECT *
FROM ( SELECT a.Id ,
( CASE WHEN b.Id IS NULL THEN a.Name
ELSE b.Name
END ) AS Name ,
( CASE WHEN c.Id IS NOT NULL THEN c.BillNo
WHEN b.Id IS NOT NULL THEN b.BillNo
ELSE a.BillNo
END ) AS BillNo
FROM table1 a
LEFT JOIN table2 b ON a.关联编号 = b.关联编号
LEFT JOIN table3 b ON a.关联编号 = c.关联编号
) t
WHERE t.BillNo = @BillNo
AND t.Name = @Name;
...全文
189 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2019-02-28
  • 打赏
  • 举报
回复
引用 2 楼 满庭花醉三千客 的回复:
[quote=引用 1 楼 shoppo0505 的回复:]
可以使用COALESCE ,完全符合你的要求。
三表left outer join一下,然后用COALESCE


谢谢,COALESCE 与 CASE 函数等价
而且只运行Id不能为空,表2有关联数据,但是Name字段为null,仍然以表2的null为主[/quote]
你不是用关联编号连接的么
吉普赛的歌 2019-02-28
  • 打赏
  • 举报
回复
COALESCE 可以简化语句, 不过效率不会有提高。 关联字段加上索引再试吧
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
可以使用COALESCE ,完全符合你的要求。
三表left outer join一下,然后用COALESCE


谢谢,COALESCE 与 CASE 函数等价
而且只运行Id不能为空,表2有关联数据,但是Name字段为null,仍然以表2的null为主
shoppo0505 2019-02-28
  • 打赏
  • 举报
回复
可以使用COALESCE ,完全符合你的要求。
三表left outer join一下,然后用COALESCE

27,578

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧