困扰了几天的问题,请问应该如何解决?

萧大叔 2019-08-10 04:06:20
各位大大,我是一个初学者,以下问题应该如何解决请抽空帮忙看一下:

-----------------------------------------------------------------------

SQL 服务器上有两张表如下:

表 A

单据内码 | 是否确认
---------------------
1001 | YES
1002 | NO
1003 | YES
1004 | NO
....... 此表有 7 万表数据

表 B

单据内码 | 数量 | 是否审核
---------------------------
1001 | 100 | YES
1001 | 100 | NO
1001 | 100 | YES
........... 此表同样有 7 万条数据

现在想获取:单据内码 和 数量这两列数据,同时需要筛选 表 A 中的 是否确认为 YES,表 B 中的是否审核为 YES,代码如下:

select A.单据内码,B.数量 from A inner join B on A.单据内码=B.单据内码 where A.是否确认="YES" and B.是否审核="YES"

可是运行起来超慢,而且结果也不对,A,B 表中的单据内码都是存在的,A 为表头,B 为表体,应该如何修改呢,谢谢!

...全文
259 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
q159846 2019-08-23
  • 打赏
  • 举报
回复
select A.单据内码,B.数量 from (select 单据内码 from A where 是否确认="YES") as A
inner join (select 数量,单据内码 from B where 是否审核="YES") as B on A.单据内码=B.单据内码
qq_39932185 2019-08-14
  • 打赏
  • 举报
回复
确认下表 A 的 单据内码 是唯一的吗 因为 表B 的单据内码不是唯一,如果表A也不唯一 ,那肯定会变成多对多。
吉普赛的歌 版主 2019-08-10
  • 打赏
  • 举报
回复
吉普赛的歌 版主 2019-08-10
  • 打赏
  • 举报
回复

--借用 #1 版主数据
USE tempdb
GO
--删除后面要创建的视图
IF OBJECT_ID('dbo.view_A_B') IS NOT NULL
DROP VIEW dbo.view_A_B
GO
--测试数据
if not object_id(N'Tempdb..A') is null
	drop table A
GO
GO
Create table A([单据内码] int,[是否确认] nvarchar(23))
SET NOCOUNT ON
Insert A
select 1001,N'YES' union all
select 1002,N'NO' union all
select 1003,N'YES' union all
select 1004,N'NO'
GO
if not object_id(N'Tempdb..B') is null
	drop table B
Go
Create table B([单据内码] int,[数量] int,[是否审核] nvarchar(23))
SET NOCOUNT ON
Insert B
select 1001,100,N'YES' union all
select 1001,100,N'NO' union all
select 1001,100,N'YES'
Go
--测试数据结束

--创建索引视图. 只要能创建成功, 你的效率就能提高
CREATE VIEW dbo.view_A_B
WITH SCHEMABINDING
AS
Select A.单据内码,sum(B.数量) AS 数量
from dbo.A INNER JOIN dbo.B 
	ON A.单据内码 = B.单据内码 AND A.是否确认='YES' AND B.是否审核='YES'
GROUP BY A.单据内码
GO

SELECT * FROM view_A_B
你看一下结果, 是否是你要的。 如果是你要的, 这种设计的效率是最高的。 因为这个聚合的结果放在了索引视图(相当于真实的表,占存储空间) 你查询时就是秒出的。
二月十六 版主 2019-08-10
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([单据内码] int,[是否确认] nvarchar(23))
Insert #A
select 1001,N'YES' union all
select 1002,N'NO' union all
select 1003,N'YES' union all
select 1004,N'NO'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([单据内码] int,[数量] int,[是否审核] nvarchar(23))
Insert #B
select 1001,100,N'YES' union all
select 1001,100,N'NO' union all
select 1001,100,N'YES'
Go
--测试数据结束
SELECT t1.单据内码,t2.数量 FROM (
Select * from #A WHERE 是否确认='YES'
)t1 JOIN (
SELECT 单据内码, 数量 FROM #B WHERE 是否审核='YES'
)t2
ON t2.单据内码 = t1.单据内码


34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧