到处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

相关文章
|
9天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
118 5
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
116 4
|
29天前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
50 2
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
63 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
74 6
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
2月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
161 0
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
47 0
|
3月前
|
数据采集 存储 数据挖掘
使用Python读取Excel数据
本文介绍了如何使用Python的`pandas`库读取和操作Excel文件。首先,需要安装`pandas`和`openpyxl`库。接着,通过`read_excel`函数读取Excel数据,并展示了读取特定工作表、查看数据以及计算平均值等操作。此外,还介绍了选择特定列、筛选数据和数据清洗等常用操作。`pandas`是一个强大且易用的工具,适用于日常数据处理工作。