各位大大,我是一个初学者,以下问题应该如何解决请抽空帮忙看一下:-----------------------------------------------------------------------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 为表体,应该如何修改呢,谢谢!
---------------------
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 为表体,应该如何修改呢,谢谢!
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.单据内码
--借用 #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.单据内码
GOSELECT * FROM view_A_B
你看一下结果, 是否是你要的。
如果是你要的, 这种设计的效率是最高的。
因为这个聚合的结果放在了索引视图(相当于真实的表,占存储空间)
你查询时就是秒出的。
因为 表B 的单据内码不是唯一,如果表A也不唯一 ,那肯定会变成多对多。
inner join (select 数量,单据内码 from B where 是否审核="YES") as B on A.单据内码=B.单据内码