日期:2014-05-17  浏览次数:20447 次

主表 从表
多说无益,直接上表
use tempdb
go
--主表A
if not OBJECT_ID('tempdb..#A') IS NULL
drop table #A
CREATE TABLE #A(Auid int)
INSERT INTO #A(Auid)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4
GO
--从表B
if not OBJECT_ID('tempdb..#B') IS NULL
drop table #B
CREATE TABLE #B(Auid int,B1 varchar(10) null)
INSERT INTO #B(Auid,B1)
SELECT 1,'' UNION ALL
SELECT 2,'' UNION ALL
SELECT 2,'A' UNION ALL
SELECT 3,'B' UNION ALL
SELECT 3,'A'
--SELECT 1,'  ' UNION ALL(暂不考虑,也视为无记录)
--SELECT 1,null UNION ALL(同上)
--SELECT 2,null UNION ALL(同上)
--要的效果结果(希望效率比较优化的)
/*
Auid    B1
-------------
1       0     --A中的1在B中没有正常记录
2       1     --A中的1在B中有1个记录
3       2     --A中的1在B中有两个记录
4       0     --A中的1在B中没有记录
*/

我是这样做的
表连接 加 sum case
 不知道效率怎样
------最佳解决方案--------------------
SELECT  a.Auid ,
         ISNULL(b1, 0) b1
 FROM    #a a
         LEFT JOIN ( SELECT  Auid ,
                             COUNT(1) b1
                     FROM    #b
                     WHERE   b1 <> ''
                     GROUP BY Auid
                   ) b ON a.Auid = b.Auid

------其他解决方案--------------------
引用:
引用:SQL code

SQL code?12345SELECT A.Auid,SUM(CASE B.B1 WHEN ''THEN 0 ELSE 1 END)FROM A INNER JOIN B ON A.Auid=B.Auidgroup by A.Auid
不知道我这效率咋样
我想要效率好点的
执行计划还不懂得看..……
执行计划贴出来看看,因为数据在你那里。我个人觉得在select中再运算的话,可能你要面对的数据量会比较多。所以我放在子查询里面做的。
------其他解决方案--------------------
引用:
引用:
引用:引用:执行计划贴出来看看……实际数据有点出入
不过我想你能明白你这个执行计划是你的还是我的那句?问题在扫描那里,没有用到索引,但是的确你又没有where条件。容易造成扫描。嗯,看着61%我想应该是,但都是百分比,不太理解
呃,这个是我的语句。
是不是调试出的执行计……
执行计划都是百分比的。而需要优化的部分,恰恰就是百分比占得最多的部分。优化的一个趋势(但是非必要)就是把百分比降下去。可能把百分比分摊到其他步骤中。从执行计划看,需要优化的第一步就是避免表扫描
------其他解决方案--------------------
引用:
引用:
有没有显示丢失索引?如果在排序那列上做个聚集索引,可以减少排序的那34%的开销。另外,你和我的哪个块?
你的比较快
介不介意问下,那种GUID(全球唯一标识)形式的列适合做索引吗?