各位大大,我是一个初学者,以下问题应该如何解决请抽空帮忙看一下:-----------------------------------------------------------------------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 为表体,应该如何修改呢,谢谢!

解决方案 »

  1.   

    --测试数据
    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.单据内码
      

  2.   


    --借用 #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
    你看一下结果, 是否是你要的。
    如果是你要的, 这种设计的效率是最高的。
    因为这个聚合的结果放在了索引视图(相当于真实的表,占存储空间)
    你查询时就是秒出的。
      

  3.   

    确认下表 A 的 单据内码 是唯一的吗
    因为 表B 的单据内码不是唯一,如果表A也不唯一  ,那肯定会变成多对多。
      

  4.   

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