sqlserver之FOR XML PATH,坐标定位,sql语句

标签: sqlserver  FOR XML PATH  经纬度计算

1.FOR XML PATH

碰到一个这样的需求,需要查询出电影的所有场次,于是就接触到了FOR XML PATH。


想要得到的就是这样的效果。首先看一下sql语句。

SELECT DISTINCT
				show_time + '|'
			FROM
				api_film_show tt
			WHERE
				tt.cinema_id = t1.cinema_id FOR XML PATH ('')
		) AS show_time

通过”|“来分割出不同的时间段的场次。其次比较重要的就是path这个参数,通过里面定义相应的值,可以定义为相应的根节点名称,如果不给值则无显示,通过这个函数语句,可以达到获取单个电影院下该电影的所有场次。这个语句对我来讲是很不错的了。

2.坐标计算

简单的讲,就是通过经纬度坐标进行计算两地之间的直线距离,可以通过坐标拾取系统获取相应的经纬度来进行测试。

接下来说一下sql语句。

ALTER FUNCTION [f_GetDistance]
( 
@GPSLng DECIMAL(12,6),
@GPSLat DECIMAL(12,6),
@Lng  DECIMAL(12,6),
@Lat DECIMAL(12,6)
)
RETURNS DECIMAL(12,4)
AS
BEGIN
   DECLARE @result DECIMAL(12,4)
   SELECT @result = 6378137.0*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI())+COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI()))
   RETURN @result
END

看sql语句,总共需要传入四个参数,代入到电影票业务上来说,依次代表本人所处的经度,纬度,电影院的经度,纬度,通过相应的运算获取到两点之间的直线距离。值得注意的是,如果你对sqlserver不熟悉(比如LZ),一定记住在调用的时候加入dbo.表名,不然会一直报错不成功。

接下来我把完整的sql语句展现出来,说老实话,写完还是对自己有点作用的。

SELECT
	a.cinema_id,
	a.cinema_name,
	a.cinema_logo,
	a.cinema_add,
	a.region_id,
	a.contact,
	a.get_ticket_way,
	a.latitude,
	a.longitude,
	b.user_price,
	b.show_time,
	dbo.f_GetDistance (
		121.508186,31.289124,
		a.longitude,
		a.latitude
	) AS distance
FROM
	api_film_cinema a
JOIN (
	SELECT
		t1.cinema_id,
		MIN (t1.user_price) AS user_price,
		(
			SELECT DISTINCT
				show_time + '|'
			FROM
				api_film_show tt
			WHERE
				tt.cinema_id = t1.cinema_id FOR XML PATH ('')
		) AS show_time
	FROM
		api_film_show t1
	JOIN api_film_cinema t2 ON t1.cinema_id = t2.cinema_id
	JOIN api_film_city t3 ON t2.city_id = t3.city_id
	AND t3.city_name = '上海'
	AND t1.film_id = '201805370875'
	AND 
t1.show_date = '2018-05-14'
	
	GROUP BY
		t1.cinema_id
) b ON a.cinema_id = b.cinema_id;

3.String转int进行数值运算

  CAST (t1.show_time AS INT) + CAST (t1.duration AS INT) AS end_time,

将相应的string类型转化为int,关键就是cast语句块,调用完成即可进行相应的数值运算。

4.sql优化自己理解

4.1,查询出需要展现的字段,不要查询出多余的字段,以免影响速度,比如电影票中一张表会有超多的字段,这个时候就需要根据实际场景需要进行定义dto取值即可。

4.2,在费时费力的字段上面建立索引,比如日期上面我们就可以建立一个非聚集索引,这样可以大大加强我们的查询速度。

4.3,对于多表之间的查询,少用left join,慎用子查询嵌套,尽可能的去进行优化。

4.4,仔细仔细再仔细。


版权声明:本文为T_james原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/T_james/article/details/80309797

智能推荐

SQL Server 常見For XML語句比較

SQL語句: 結果: For XML Raw sql 結果 說明 每一條記錄就是一行,row是固定的標籤名,列名對應裏面的屬性名 For XML Path sql 結果 說明 Root(可選)參數的值作為第一層,Path參數的值作為第二層,列名作為第三層,全部以標籤的形式展現,最多三層,列與列平級。 For XML Auto sql 結果 說明 根據表的別名,列出現的順序(第一個列是哪個表的,哪個...

XML之sql:column用法对性能影响

  查看执行计划: sql:column+position用法:     转载于:https://www.cnblogs.com/Roy_88/archive/2012/12/31/5463063.html...

Mybatis的CRUD之XML方式以及动态SQL

MyBatis 接口代理方式实现 Dao 层 传统方式实现 Dao 层,我们既要写接口,还要写实现类。而 MyBatis 框架可以帮助我们省略编写 Dao 层接口实现类的步骤。程序员只需要编写接口,由 MyBatis 框架根据接口的定义来创建该接口的动态代理对象。 实现规则 映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。 映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接...

XML之SAX解析XML实例

--------------------------------------------XML之SAX解析XML------------------------------------------ 一,前言 SAX是针对DOM解析XML内存占用大,查找速度慢的缺点而出现的解决方案。SAX解析器对XML文档解析会从XML文档开始位置起进行解析,同时根据已经定义好的事件处理器,来解决当前所解析的部分(...

NTP服务器搭建(运维实用小项目)

环境介绍 两台centos7 192.168.59.130 192.168.59.131 server端192.168.59.131安装NTP服务 修改配置文件 重启ntp服务 客户机192.168.59.130安装ntpdate...

猜你喜欢

RecycleView Grid样式的分割线,均分每行

说明 最近写一个GridView的布局,需要一个较宽的分割线样式,发现自己以前写的还有网上的很多都有问题,主要存在没考虑到divider也有一定宽度,这样导致第一行特别宽,其他行都较短。 特修改bug,顺便分享一下 原理 其实很简单,主要就是在 重新 ItemDecoration 的 getItemOffsets方法 给设置每块的布局添加偏移量padding,注释都在里面 totalwidth =...

C语言实现通讯录

一、通讯录要求: 实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址 提供方法: 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 清空所有联系人 以名字排序所有联系人 二、代码实现 1.头文件和宏定义 2.定义联系人结构体和通讯录结构体 3.定义一个结构体指针类型Func 定义一个AddressBo...

Hive分区

创建分区表  dt 是分区列 增加分区 删除分区 导入分区数据 准备数据 pt1-2018-07-13.txt 和 pt1-2018-07-14.txt 导入数据 查看hdfs hdfs查询分区 hdfs显示分区信息 本机环境hadoop-2.7.6目录不支持=号,查询时用?代替 hive查询分区数据...

外部类,内部类以及静态内部类的加载关系深入探讨

前言:   在看单例模式的时候,在网上找帖子看见其中有一种(IoDH) 实现单例的方式,其中用到了静态内部类,文章中有写到当jvm加载外部类的时候,并没有加载静态内部内这和之前自己想的不一样,特意在网上找了一些帖子总结一下。 一、学习前千的疑问:   稍微了解Java虚拟机内的加载过程的步骤,都很清楚,一个类的静态资源、一些常量都是在类加载的时候就被加载金内存中分配空间了,所以我一开始理所当然的以...

使用高德API接口查询两个地址之间的距离

首先要去高德注册一个账号获取到key,然后创建应用web服务生成的key 如果经纬度是其他,例如百度,谷歌的需要进行坐标系转换 坐标系采用是小数点后6位的,如果超出会报错坐标无效 这个是高德地址 创建成功后会生成key 关于坐标系转换,看我其他文章,有方法,直接拿来用就好...