到处excel表格的数据和页面的数据不一致

简介:

列表:Select t,m.frameworkName,ma.accountName from SaleEntity t left join MediaAccountEntity ma on t.mediaAccountId=ma.id left  join  MediaEntity  m on ma.mediaId=m.id left  join  ClientEntity  c on ma.clientId=c.id  where 1=1  order by t.id desc.




excel:Select t, m.frameworkName , ma.accountName from SaleEntity t join MediaAccountEntity ma on t.mediaAccountId=ma.id left  join  MediaEntity  m on ma.mediaId=m.id  left  join  ClientEntity  c on ma.clientId=c.id  order by m.id desc


今天遇到到处excel表格的数据比页面展示的数据少几条


首先你要知道excel表格的数据通过什么查出来的 列表的数据通过什么查出来的


通过打断点 找出他们的查询语句 做个对比 发现不同点  


接着吧excel表格的数据查询语句改成和列表的一直 join 改成left join 代码出现空指针异常 接着解决空指针异常


问题 

为什么使用相同的语句 列表不会出现空指针异常 但是导出excel表格 出现空指针异常 页面报500

还有join 和left join在多表关联查询的时候有啥区别

还有一个我问题别人在一个地方先new 了一个 不报空指针 和直接返回结果 报空指针  待解决



sql中join与left-join图解区别


inner join 是内连接  join默认就是inner join


Join  表示两个表都必须存在的
left join 表示以左边的表为基准,不管你右边的表有没有都显示
right join和left join刚好相反
full outer join表示只要在两个表中任何一个表中有的都显示


预先生成两张测试表,并插入一下测试数据:

create table t1(id int, name char(10), primary key (id));

create table t2(id int, score int, primary key (id));

insert into t1 values(1, “lucy”);

insert into t1 values(2, “lily”);

insert into t1 values(3, “jack”);

insert into t2 values(2, 20);

insert into t2 values(3, 30);

insert into t2 values(4, 40);

t1表内容如下:

t2表内容如下:

下面来简述join和left join/right join的区别:

inner join

select * from t1 inner join t2 on t1.id = t2.id;

公共部分的数据才会被查询出来;

left join

select * from t1 left join t2 on t1.id = t2.id;

查询出来的结果和前表记录数一样多;

right join

select * from t1 right join t2 on t1.id = t2.id;

能转化为

select * from t2 left join t1 on t1.id = t2.id;



SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别


首先看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果。

  • 在数据库中新建两张表,并插入要测试的数据。

新建表:

[sql] view plain copy

  1. USE [Test]  

  2. GO  

  3. /****** 对象:  Table [dbo].[EMP]    脚本日期: 06/22/2012 15:37:28 ******/  

  4. SET ANSI_NULLS ON  

  5. GO  

  6. SET QUOTED_IDENTIFIER ON  

  7. GO  

  8. CREATE TABLE [dbo].[EMP](  

  9.     [ENAME] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,  

  10.     [CITY] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL  

  11. ON [PRIMARY]  


 

[sql] view plain copy

  1. USE [Test]  

  2. GO  

  3. /****** 对象:  Table [dbo].[SAL]    脚本日期: 06/22/2012 15:38:04 ******/  

  4. SET ANSI_NULLS ON  

  5. GO  

  6. SET QUOTED_IDENTIFIER ON  

  7. GO  

  8. CREATE TABLE [dbo].[SAL](  

  9.     [ENAME] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,  

  10.     [SALARY] [money] NULL  

  11. ON [PRIMARY]  


插入数据得到的表:

EMP表:

SAL表:

  • 左连接

    [sql] view plain copy


    左连接,表EMP是主表,因此查询结果是显示EMP(主表)的全部信息和SAL(附表)与EMP相关的信息。

  1. select  * from EMP Left join SAL on EMP.ENAME = SAL.ENAME;  

右连接[sql] view plain copy右连接,表SAL是主表,因此查询结果显示SALT(主表)的全部信息和EMP(附表)与SAL想关的信息。

  1. Select * from EMP Right join SAL on EMP.ENAME = SAL.ENAME;  

内连接[sql] view plain copy内连接,显示的是连个表相关的信息。

  1. SELECT * FROM EMP inner join SAL on EMP.ENAME = SAL.ENAME;  

全连接[sql] view plain copy全连接,显示两个表所有的信息。

  1. SELECT * FROM EMP full join SAL on EMP.ENAME = SAL.ENAME;  




图解SQL的inner join、left join、right join、full outer join、union、union all的区别



SQL的Join语法有很多,
inner join(等值连接) 只返回两个表中联结字段相等的行,
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,
看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式。

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

A表
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

让我们看看不同JOIN的不同。

1.INNER JOIN

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

满足TableA.name = TableB.name的数据共有两条,即 name=Pirate 和 name=Ninja ,结果如下

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

Inner join 产生的结果集中,是A和B的交集。

2.FULL [OUTER] JOIN 

(1)

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

 TableA.name = TableB.name 的情况,A和B的交集有两条数据,那么 FULL OUTER JOIN的结果集,

应该是2+2+2=6条,即上面的交集,再加剩下的四条数据,没有匹配,以null补全。

结果集
(TableA.) (TableB.)
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 Vade

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

可以使用IFNULL判断。

(2)

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

添加这个 where 条件,可以排除掉两表的数据交集。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

 产生A表和B表没有交集的数据集。

 

3.LEFT [OUTER] JOIN

(1)

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

以左表为准,根据 TableA.name = TableB.name 这个条件,右表没有的数据 null 补全。

结果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

 

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

(2)

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

其实就是在上一步的结果集中又做了一次筛选工作。

结果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null

产生在A表中有而在B表中没有的集合。

4.RIGHT [OUTER] JOIN

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

5.UNION  UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

(1)SELECT name FROM TableA UNION SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade

选取不同值。

(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

全部列出来。

(3)注意:

SELECT * FROM TableA UNION SELECT * FROM TableB

新结果集
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并。

 

6.CROSS JOIN

还需要注意的是“交差集” cross join,这种Join没有办法用文式图表示,

因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。

表达式如下:

SELECT * FROM TableA CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,很少用到这个语法。

但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。当表很大的时候,会极大的影响性能。

 

 

画图解释 SQL join 语句


我认为 Ligaya Turmelle 的关于SQL联合(join)语句的帖子对于新手开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

  1. id name id name

  2. ------------

  3. 1Pirate1Rutabaga

  4. 2Monkey2Pirate

  5. 3Ninja3DarthVader

  6. 4Spaghetti4Ninja

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。

内联合(inner join)

  1. SELECT * FROM TableA

  2. INNER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 3Ninja4Ninja

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)

inner join

inner join

全外联合(full outer join)

  1. SELECT * FROM TableA

  2. FULL OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 2Monkeynullnull

  8. 3Ninja4Ninja

  9. 4Spaghettinullnull

  10. nullnull1Rutabaga

  11. nullnull3DarthVader

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)

Full outer join

Full outer join

左外联合(left outer join)

  1. SELECT * FROM TableA

  2. LEFT OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. id name id name

  5. ------------

  6. 1Pirate2Pirate

  7. 2Monkeynullnull

  8. 3Ninja4Ninja

  9. 4Spaghettinullnull

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)

Left outer join

Left outer join

左外联合,然后用where语句排除一边我们不想要的记录

  1. SELECT * FROM TableA

  2. LEFT OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. WHERE TableB.id IS null

  5. id name id name

  6. ------------

  7. 2Monkeynullnull

  8. 4Spaghettinullnull

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)

WHERE TableB.id IS nul

全外联合,然后用where语句排除两边都不想要的记录

  1. SELECT * FROM TableA

  2. FULL OUTER JOIN TableB

  3. ON TableA.name =TableB.name

  4. WHERE TableA.id IS null

  5. OR TableB.id IS null

  6. id name id name

  7. ------------

  8. 2Monkeynullnull

  9. 4Spaghettinullnull

  10. nullnull1Rutabaga

  11. nullnull3DarthVader

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)

 

WHERE TableA.id IS null

交叉联合(cross join)

还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:

  1. SELECT * FROM TableA

  2. CROSS JOIN TableB

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。 

总结图

下图由 Moffatt 在 2008 年制作(点击可查看大图)。PS:Jeff Atwood 的文章写于 2007 年。

SQL Joins | 一张图看懂 SQL 的各种 join 用法

SQL Joins

本文转自wiwi博客51CTO博客,原文链接http://blog.51cto.com/wiwili/1965845如需转载请自行联系原作者


wiwili

相关文章
|
22天前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
51 0
|
1月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0
|
1月前
|
Java API Apache
使用AOP+反射实现Excel数据的读取
使用AOP+反射实现Excel数据的读取
|
1月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
54 0
|
1月前
|
安全 Java 数据库连接
jdbc实现批量给多个表中更新数据(解析Excel表数据插入到数据库中)
jdbc实现批量给多个表中更新数据(解析Excel表数据插入到数据库中)
154 0
|
1月前
|
存储 数据处理 Python
使用Python批量合并Excel文件的所有Sheet数据
使用Python批量合并Excel文件的所有Sheet数据
33 0
|
1月前
|
存储 数据处理 Python
使用openpyxl库从Excel文件中提取指定的数据并生成新的文件
使用openpyxl库从Excel文件中提取指定的数据并生成新的文件
28 0
|
1月前
|
存储 数据处理 数据格式
Python中导入Excel数据:全面解析与实践
Python中导入Excel数据:全面解析与实践
41 0
|
1月前
|
存储 数据采集 数据可视化
Python如何读取Excel中的数据?
Python如何读取Excel中的数据?
23 0
|
1月前
|
存储 关系型数据库 MySQL
Python导入Excel数据到MySQL数据库
Python导入Excel数据到MySQL数据库
91 0