GVKun编程网logo

从SQL Server中的JOIN结果获取不同的行

24

这篇文章主要围绕从SQLServer中的JOIN结果获取不同的行展开,旨在为您提供一份详细的参考资料。我们将全面介绍从SQLServer中的JOIN结果获取不同的行,同时也会为您带来SQLServer

这篇文章主要围绕从SQL Server中的JOIN结果获取不同的行展开,旨在为您提供一份详细的参考资料。我们将全面介绍从SQL Server中的JOIN结果获取不同的行,同时也会为您带来SQL Server SQL中的left join right join、SQL Server SQL的Join使用图解教程、SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能、SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能 - INNER JOIN vs LEFT JOIN performance in SQL Server的实用方法。

本文目录一览:

从SQL Server中的JOIN结果获取不同的行

从SQL Server中的JOIN结果获取不同的行

我有两个表,一个用于存储Album_Name,另一个用于存储Album_Photos

我想编写一个查询,以便它可以为我提供以下详细信息

Album_Name    Album_ID     Album_Date     ImageSmall
Album One     1            2013-08-02      100.jpg
Album Two     2            2013-09-09      55.jpg

我想从细节专辑详情Album_Name表,第一图像这我不是分配给从相册Album_Photo

我尝试了不适用于的JOINS,然后我创建了一个视图将遵循SQL,这是行不通的

SELECT 
   a.Album_Name AS Album_Name,a.Album_Date AS Album_Date,a.Page_ID AS PageID,p.Image_ID AS Image_ID,p.Image_Small AS Image_Small 
FROM 
   Album_Name a
LEFT OUTER JOIN 
   Album_Photos p ON a.Album_ID = p.Album_ID

我尝试DISTINCT Album_Name过查看它是否使我与上面的语句在同一行

SELECT 
    DISTINCT [Album_Name],Album_Date,Page_ID,Image_Small  
FROM 
    vw_AlbumName_AlbumPhotos 
WHERE 
    Page_ID = 3

样本数据Album_NameAlbum_Photos表格

Album_ID    Album_Name  Album_Date  Page_ID
1   Album One   2013-08-02      3
2   Album Two   2013-09-09      3
3   Album Three 2013-09-10      9

Image_ID    Page_ID Album_ID    ImageSmall
1       0       1   100.jpg
2       0       1   21.jpg
3       0       1   36.jpg
4       0       1   44.jpg
5       0       2   55.jpg
6       0       2   66.jpg
7       0       3   10.jpg

任何帮助表示赞赏。

SQL Server SQL中的left join right join

SQL Server SQL中的left join right join

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

以下是它们的共同点:
1. 关于左右表的概念。左表指的是在sql语句中排在left join左边的表,右表指的是排在left join右边的表。
2. 在拼成的大表中,左表排在左边,右表排在右边。
3. on条件语句最好用=号对两表相应的主外键进行连接。当然,也可以用其他操作符,如>,<,来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定。如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的!
4. on条件语句不能省略。
5. 可以连锁使用join,每次使用join都令另一表与当前的表或连接的结果相连接。
在下文中,用到了两个表,部门表与组织表,其中,部门表有一名为组织编号的外键,指向组织表中的主键编号。
inner join
格式:select * from 部门 inner join 组织 on 部门.组织编号 = 组织.编号
目的:将两表中符合on条件的所有记录都找出来。
规律:
1. 拼出的大表记录不会增加。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过=号将主外键进行连接,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。
备注:inner join 是默认的连接方式,可缩写为join。
转化为where子句:
select * from 部门,组织 where 部门.组织编号 = 组织.编号
left outter join
格式: select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
格式: select * from 组织 left join 部门 on 组织.编号 = 部门.组织编号
目的:将左表的所有记录列出,右表中只要符合on条件的,与左表记录相拼合,不符合条件的,填以null值。
规律:
1. 选出所有符合条件的左表,如果左边与右表的关系是一对一的关系,则拼成的大表记录不会改变。
如果左边与右表的关系是多对一的关系,则拼成的大表记录也不会改变。
如果左边与右表的关系是一对多的关系,则拼成的大表记录会增加。对于每一具有一对多关系的左表记录,如果左表1:N与右表对应,那么会多出N-1条记录。例如,如果左表第一条记录1:3对应于右表,多出2条记录。如果左表第二条记录1:2对应于右表,则再多出1条记录。这样,总共多出3条记录。其他类推。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
3. 如果左边与右表的关系是一对多的关系,对于左表任一记录,如果右表没有记录与其相对应,则全部填以null值。
典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。
备注:left outter join可用left join代替。在有些数据库中,如HsqlDb,只能使用left join而不能使用left outter join。
转化为where子句:
select * from 部门,组织 where 部门.组织编号 = 组织.编号
right outter join
格式: select * from 部门 right join 组织 on 部门.组织编号 = 组织.编号
格式: select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号
目的:将右表的所有记录列出,左表中只要符合on条件的,与右表记录相拼合,不符合条件的,填以null值。
规律:(与left outter join相反)
典型应用:可转化成left outter join。例如
select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号

select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
的效果一样

SQL Server SQL的Join使用图解教程

SQL Server SQL的Join使用图解教程

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

对于sql的Join,在学习起来可能是比较乱的。我们知道,sql的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 venn diagrams 解释了sql的Join。我觉得清楚易懂,转过来。

假设我们有两张表。

Table A 是左边的表。
Table B 是右边的表。
其各有四条记录,其中有两条记录是相同的,如下所示:

代码如下:

 
id name id name 
-- ---- -- ---- 
1 Pirate 1 Rutabaga 
2 Monkey 2 Pirate 
3 Ninja 3 Darth Vader 
4 Spaghetti 4 Ninja 

下面让我们来看看不同的Join会产生什么样的结果。

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 NinjaInner join
产生的结果集中,是A和B的交集。

【图片暂缺】

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth VaderFull outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

 

【图片暂缺】

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null nullLeft outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

【图片暂缺】

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null产生在A表中有而在B表中没有的集合。

【图片暂缺】

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader产生A表和B表都没有出现的数据集。

【图片暂缺】
还需要注册的是我们还有一个是“交差集” cross join,这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

代码如下:

 
SELECT * FROM TableA 
CROSS JOIN TableB 

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能

SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能

我已经创建了在 9 个表上使用 INNER JOIN 的 SQL 命令,无论如何这个命令需要很长时间(超过五分钟)。所以我的人建议我将 INNER JOIN
更改为 LEFT JOIN,因为 LEFT JOIN 的性能更好,尽管我知道。修改后,查询速度明显提升。

我想知道为什么 LEFT JOIN 比 INNER JOIN 快?

我的 SQL 命令如下所示: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D等等

更新: 这是我的架构的简要说明。

FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
    INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
        ON a.CompanyCd = b.CompanyCd 
           AND a.SPRNo = b.SPRNo 
           AND a.SuffixNo = b.SuffixNo 
           AND a.dnno = b.dnno
    INNER JOIN exFSlipDet h -- PK = CompanyCd,FSlipNo,FSlipSuffix,FSlipLine
        ON a.CompanyCd = h.CompanyCd
           AND a.sprno = h.AcctSPRNo
    INNER JOIN exFSlipHdr c -- PK = CompanyCd,FSlipSuffix
        ON c.CompanyCd = h.CompanyCd
           AND c.FSlipNo = h.FSlipNo 
           AND c.FSlipSuffix = h.FSlipSuffix 
    INNER JOIN coMappingExpParty d -- NO PK AND FK
        ON c.CompanyCd = d.CompanyCd
           AND c.CountryCd = d.CountryCd 
    INNER JOIN coProduct e -- PK = CompanyCd,ProductSalesCd
        ON b.CompanyCd = e.CompanyCd
           AND b.ProductSalesCd = e.ProductSalesCd 
    LEFT JOIN coUOM i -- PK = UOMId
        ON h.UOMId = i.UOMId 
    INNER JOIN coProductOldInformation j -- PK = CompanyCd,BFStatus,SpecCd
        ON a.CompanyCd = j.CompanyCd
            AND b.BFStatus = j.BFStatus
            AND b.ProductSalesCd = j.ProductSalesCd
    INNER JOIN coProductGroup1 g1 -- PK = CompanyCd,ProductCategoryCd,UsedDepartment,ProductGroup1Cd
        ON e.ProductGroup1Cd  = g1.ProductGroup1Cd
    INNER JOIN coProductGroup2 g2 -- PK = CompanyCd,ProductGroup2Cd
        ON e.ProductGroup1Cd  = g2.ProductGroup1Cd

SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能 - INNER JOIN vs LEFT JOIN performance in SQL Server

SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能 - INNER JOIN vs LEFT JOIN performance in SQL Server

问题:

I''ve created SQL command that uses INNER JOIN on 9 tables, anyway this command takes a very long time (more than five minutes).我已经创建了在 9 个表上使用 INNER JOIN 的 SQL 命令,无论如何这个命令需要很长时间(超过五分钟)。 So my folk suggested me to change INNER JOIN to LEFT JOIN because the performance of LEFT JOIN is better, despite what I know.所以我的朋友建议我将 INNER JOIN 改为 LEFT JOIN 因为 LEFT JOIN 的性能更好,尽管我知道。 After I changed it, the speed of query got significantly improved.改了之后,查询速度明显提高了。

I would like to know why LEFT JOIN is faster than INNER JOIN?我想知道为什么 LEFT JOIN 比 INNER JOIN 快?

My SQL command look like below: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D and so on我的 SQL 命令如下所示: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D等等

Update: This is brief of my schema.更新:这是我的架构简介。

FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
    INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
        ON a.CompanyCd = b.CompanyCd 
           AND a.SPRNo = b.SPRNo 
           AND a.SuffixNo = b.SuffixNo 
           AND a.dnno = b.dnno
    INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine
        ON a.CompanyCd = h.CompanyCd
           AND a.sprno = h.AcctSPRNo
    INNER JOIN exFSlipHdr c -- PK = CompanyCd, FSlipNo, FSlipSuffix
        ON c.CompanyCd = h.CompanyCd
           AND c.FSlipNo = h.FSlipNo 
           AND c.FSlipSuffix = h.FSlipSuffix 
    INNER JOIN coMappingExpParty d -- NO PK AND FK
        ON c.CompanyCd = d.CompanyCd
           AND c.CountryCd = d.CountryCd 
    INNER JOIN coProduct e -- PK = CompanyCd, ProductSalesCd
        ON b.CompanyCd = e.CompanyCd
           AND b.ProductSalesCd = e.ProductSalesCd 
    LEFT JOIN coUOM i -- PK = UOMId
        ON h.UOMId = i.UOMId 
    INNER JOIN coProductOldInformation j -- PK = CompanyCd, BFStatus, SpecCd
        ON a.CompanyCd = j.CompanyCd
            AND b.BFStatus = j.BFStatus
            AND b.ProductSalesCd = j.ProductSalesCd
    INNER JOIN coProductGroup1 g1 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup1Cd
        ON e.ProductGroup1Cd  = g1.ProductGroup1Cd
    INNER JOIN coProductGroup2 g2 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup2Cd
        ON e.ProductGroup1Cd  = g2.ProductGroup1Cd

解决方案:

参考一: https://stackoom.com/question/BRKL
参考二: INNER JOIN vs LEFT JOIN performance in SQL Server

今天关于从SQL Server中的JOIN结果获取不同的行的介绍到此结束,谢谢您的阅读,有关SQL Server SQL中的left join right join、SQL Server SQL的Join使用图解教程、SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能、SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能 - INNER JOIN vs LEFT JOIN performance in SQL Server等更多相关知识的信息可以在本站进行查询。

本文标签: