解决方案 »

  1.   

    楼主你也看世界杯吗,呵呵我觉得完全可以脱离B表了直接用AC表就可以   select tA.col1, case when t.col1 is null then 0 else t.total end as total from tA--没有出现的记为0
       left join
       (
       select col1,COUNT(1) as total from tC
       group by col1 --统计出C表中A的ID的次数,这个A的ID处出现在C表中的
       )t on ta.col1=t.col1
      

  2.   

    A表不能直接和C表关联只能和B表关联,所以你回答的不对
      

  3.   


    create table tA
    (
    col1 int,
    col2 varchar(50)
    )truncate table tAdeclare @i int
    set @i=1
    while @i<=10000
    begin
    insert into tA values (@i,NEWID())
    set @i=@i+1
    end
    create table tB
    (
    col1 int,
    col2 int,
    col3 varchar(50)
    )
    insert into tB values (RAND()*100000,RAND()*100000,NEWID())
    go 100000create table tC
    (
    col1 int,
    col2 int,
    col3 varchar(50)
    )
    insert into tC values (RAND()*100000,RAND()*100000,NEWID())
    go 50000--AB之间靠col1关联,BC之间靠col2关联select
    ta.col1,tb.col1,tb.col2,tc.col2,
     CASE WHEN (TB.col1 is null  or tc.col1 is null) then 0 
     else COUNT(1) over(partition by ta.col1) end as total
    from tA left join tB on ta.col1=tb.col1  left join tC on tb.col2=tc.col2
    --where (有的话)过滤条件
    --order by tA.col1,没必要就不用排序了
      

  4.   

    请LZ提供A,B,C表的关联字段和关联条件才能帮你写SQL喔.
      

  5.   


    A.ID=B.CUSTOMERID
    B.ORDERID=C.ORDERID
      

  6.   


    select A.ID,
           isnull(D.qty,0) 'qty'
     from A表 A
     left join 
     (select B.CUSTOMERID,count(1) 'qty'
      from B表 B 
      inner join C表 C on B.ORDERID=C.ORDERID
      group by B.CUSTOMERID) D on A.ID=D.CUSTOMERID另:
    A表上最好要有索引(ID)
    B表上最好要有索引(CUSTOMERID,ORDERID)
    C表上最好要有索引(ORDERID)
      

  7.   


    (4784 行受影响)
    表 'Dealers'。扫描计数 33,逻辑读取 346 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuotePrice'。扫描计数 33,逻辑读取 5286 次,物理读取 273 次,预读 5274 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuoteCarSelled'。扫描计数 33,逻辑读取 9831 次,物理读取 374 次,预读 9775 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuotePrice_Del'。扫描计数 33,逻辑读取 11359 次,物理读取 317 次,预读 11423 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。请问这是我的查询计划 你觉得我的sql还能优化么?
      

  8.   

    (4784 行受影响)
    表 'Dealers'。扫描计数 33,逻辑读取 346 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuotePrice'。扫描计数 33,逻辑读取 5286 次,物理读取 273 次,预读 5274 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuoteCarSelled'。扫描计数 33,逻辑读取 9831 次,物理读取 374 次,预读 9775 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'QuotePrice_Del'。扫描计数 33,逻辑读取 11359 次,物理读取 317 次,预读 11423 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。请问这是我的查询计划 你觉得我的sql还能优化么?
      

  9.   

    ctrl+m,然后执行:
    select A.ID,
           isnull(D.qty,0) 'qty'
     from A表 A
     left join 
     (select B.CUSTOMERID,count(1) 'qty'
      from B表 B 
      inner join C表 C on B.ORDERID=C.ORDERID
      group by B.CUSTOMERID) D on A.ID=D.CUSTOMERID把图贴上来
      

  10.   

    这个不是"查询计划", 只是SQL执行的IO统计.
    先从宏观上看,执行时间?鄙人写法与你原有的写法哪个执行时间少?