主表 从表
多说无益,直接上表
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
[其他解释]
执行计划贴出来看看,因为数据在你那里。我个人觉得在select中再运算的话,可能你要面对的数据量会比较多。所以我放在子查询里面做的。
[其他解释]
执行计划都是百分比的。而需要优化的部分,恰恰就是百分比占得最多的部分。优化的一个趋势(但是非必要)就是把百分比降下去。可能把百分比分摊到其他步骤中。从执行计划看,需要优化的第一步就是避免表扫描
[其他解释]
以前听说不适合,但是最近在看一本书,由说可以的,但是不要用newid()来产生,而要用NEWSEQUENTIALID() 这个函数来生成。
[其他解释]
你这个执行计划是你的还是我的那句?问题在扫描那里,没有用到索引,但是的确你又没有where条件。容易造成扫描。
[其他解释]
select a.Auid,COUNT(b.Auid) from #A a left join
(select * from #B where rtrim(ltrim(B1))<>'') b
on a.Auid =b.auid
group by a.Auid
[其他解释]
b表的第一二行是null还是空字符串啊?
[其他解释]
select a.auid,COUNT(1) as B1
from #A as a left join #B as b on a.auid=b.auid
where b.B1<>''
group by a.auid
[其他解释]
是空字符串
[其他解释]
2楼的我执行怎么不是那个结果?
[其他解释]
SELECT
A.Auid,SUM(CASE B.B1 WHEN ''THEN 0 ELSE 1 END)
FROM
A INNER JOIN B ON A.Auid=B.Auid
group by A.Auid
不知道我这效率咋样
我想要效率好点的
执行计划还不懂得看...
[其他解释]
SELECT
title,COUNT(TITLE),SUM(CASE BB.SINGE WHEN 0 THEN 1 ELSE 0 END)
FROM
aa LEFT JOIN BB ON AA.kk=BB.KK GROUP BY TITLE
[其他解释]
上面贴错地方了,不用管哈哈
[其他解释]
实际数据有点出入
不过我想你能明白
[其他解释]
嗯,看着61%我想应该是,但都是百分比,不太理解
呃,这个是我的语句。
是不是调试出的执行计划,百分分配在别的地方比较优?
你的那句,我改下,等会发出来
[其他解释]
select a.Auid,COUNT(b.Auid) from #A a left join
(select * from #B where B1<>'') b
on a.Auid =b.auid
group by a.Auid
[其他解释]
use tempdb
go
if not OBJECT_ID('[tempdb..#A]') IS not 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
if not OBJECT_ID('[tempdb..#B]') IS not 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'
; with sel
as(
select a.auid,b1 from #A as a left join #B as b
on a.Auid=b.Auid
)
select auid,sum(case when B1 IS null then 0 else case when b1='' then 0 else 1 end end) AS [count] from sel
group by Auid
/*
(4 row(s) affected)
(5 row(s) affected)
auid count
----------- -----------
1 0
2 1
3 2
4 0
(4 row(s) affected)
*/
[其他解释]
有没有显示丢失索引?如果在排序那列上做个聚集索引,可以减少排序的那34%的开销。另外,你和我的哪个块?
[其他解释]
原来如此
以上是你的语句
学习了
[其他解释]
你的比较快
介不介意问下,那种GUID(全球唯一标识)形式的列适合做索引吗?
[其他解释]
SELECT a.auid ,
sum(CASE WHEN b1<>'' AND b1 IS NOT NULL THEN 1 ELSE 0 END)
FROM #a a LEFT JOIN #b b ON a.auid=b.auid
GROUP BY a.auid
[其他解释]
哦,学习了
非常感谢! 结贴!