zoukankan      html  css  js  c++  java
  • 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>

    
        结果例如以下:

    总结

        小编将这句话送给自己以及全部的读者:
        在将来的路上,了解一块东西就将它的来龙去脉缕个通,并进行总结,这样以后的路将会更加通畅!
        
  • 相关阅读:
    C# WinForm判断Win7下程序是否以管理员身份运行
    C#设置文件(夹)权限
    验证字符串是否为有效的IP地址
    内存对齐
    C#线程启动时传入参数
    写字符串内容到文件
    Thread.Abort() Is Evil.
    如何优雅地控制线程状态
    C#读取文件,返回字符串形式的文件内容
    关于产生不重复随机数的算法 C#
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7221850.html
Copyright © 2011-2022 走看看