SQL Server外连接、内连接、交叉连接

    小编在做组织部维护最后收尾工作的时候,遇到了这样一个问题,需要将定性考核得分查出来、定量考核对应的数据查出来并进行得分计算、附加分查出来,最后将这三部分信息汇总之后得到总成绩,如果其中一项成绩没有进行计算那么是可以得到成绩的。
    展望师哥他们以前的逻辑,通过两个视图将定性和定量得分计算保存之后,再用一个视图将三个得分连到一起并进行计算。
    被组长规定只能用SQL语句来写,因为这样维护起来就很方便了。

    我开始先用了级联查询并计算,可是效果并不太理想,最后了解到连接查询,经过反复试验,终于有了以下成果:

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT 
	--总排名
	ROW_NUMBER() OVER(ORDER BY ISNULL((h.AdditionalResults),0) + f.TotalScores ) AS 总排名 ,
	--园区ID
	f.ObjectID AS 市直单位id,
	--园区名称
	f.Responsibility AS 开发区园区名称,
	--年份
	f.YearTime AS 年份,
	--定量总得分
	f.QuantifyScores as 定量总得分,
	--附加分
	ISNULL((h.AdditionalResults),0) AS 奖惩总得分,
	--最总定量+定性+附加总分
	ISNULL((h.AdditionalResults),0) + f.TotalScores AS 总得分
from
--汇总,通过左链接链接之后,查询下面信息,并将定性和定量总得分汇总
(SELECT 
		--园区ID
		c.ObjectID,
		--园区名称
		c.Responsibility,
		--年份
		e.YearTime,
		--定量总得分
		ISNULL((c.QuantifyScores),0) AS QuantifyScores,
		--定性定量总得分
		ISNULL((e.CalculateScores),0) + ISNULL((c.QuantifyScores),0) AS TotalScores
	FROM
		--第一层查询,查询到定性总得分当成基表
		(SELECT 
			--园区ID
			d.DevelopmentID,
			--考核时间
			d.YearTime,
			--定性总得分
			d.CalculateScores
		 FROM
			T_DevelopmentScores d) e
		 --和第一层并列的查询,查询到定量信息并计算出定量总分
		 left JOIN 
		 (SELECT 
			--园区ID
			a.ObjectID, 
			--园区名称
			a.Responsibility,
			--计算并显示定量总得分
			ISNULL(CAST(a.score AS real), 0)*ISNULL(CAST(b.Weight AS real), 0) / 100 AS QuantifyScores
		  FROM 
			T_DevelopmentQuantifyScores a,
			T_DevelopmentQuantifyTarget b 
		  WHERE a.TragetID = b.TragetID ) c ON e.DevelopmentID = c.ObjectID) f 
--和定量定性得分汇总并列,通过左链接查询到下面附加分
LEFT JOIN
(SELECT 
	--园区ID
	g.DevelopmentID,
	--附加分
	g.AdditionalResults
FROM 
	T_DevelopmentAdditionalResults g) h ON f.ObjectID = h.DevelopmentID</span>

    尝到了SQL语句中连接的甜头,于是小编在网上搜索之后并自己实践,有了下面成果:

举例介绍

    下面的内容介绍将会分别用下面两个表进行试验

外连接

  左连接(left join或者left outer join):

    说明:以左表为基础,查询右表中所有符合条件的信息,不存在的用Null补充

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a LEFT JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>

 
    结果如下: 

  右连接(right join或者right outer join)

    说明:以右表为基础,查询左表中所有符合条件的信息,不存在的用Null补充

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a right JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>

 
    结果如下: 

  完全连接(full join或者full outer join)

    说明:将两个表中的信息都查出来,没有对应的信息,用Null补充

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a full JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>

 
    结果如下: 

内连接(inner join)

    说明:只显示符合条件的信息,条件可以是(=、<、>、<>、<=、>=、!<、!>),下面只介绍条件为=的内容

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a inner JOIN dbo.TestTable2 b ON a.Hobbyid = b.Hobbyid</span>

 
    结果如下: 

交叉连接(cross join)

  无条件

    说明:将查到两个表中的所有数据的乘积(如果每个表中都有3行数据,最后显示3*3=9行数据)

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 cross JOIN dbo.TestTable2
--上面与下面的语句等价
SELECT * FROM dbo.Testtable1, dbo.TestTable2</span>

 
    结果如下: 

  有条件

    说明:将上面查到的无条件的结果按照条件进行筛选但是这里只能用where表示不能用on表示

<span style="font-family:KaiTi_GB2312;font-size:18px;">--
SELECT * FROM dbo.Testtable1 a cross JOIN dbo.TestTable2 b WHERE a.Hobbyid = b.Hobbyid</span>

 
    结果如下:

总结

    小编将这句话送给自己以及所有的读者:
    在将来的路上,了解一块东西就将它的来龙去脉缕个通,并进行总结,这样以后的路将会更加通畅!
    
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创业之路&下一个五年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值