读书人

主表 从表解决办法

发布时间: 2012-12-20 09:53:21 作者: rapoo

主表 从表
多说无益,直接上表

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(全球唯一标识)形式的列适合做索引吗?

以前听说不适合,但是最近在看一本书,由说可以的,但是不要用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
[其他解释]
引用:
b表的第一二行是null还是空字符串啊?

是空字符串

[其他解释]
2楼的我执行怎么不是那个结果?
[其他解释]
引用:
SQL code


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

[其他解释]
上面贴错地方了,不用管哈哈
[其他解释]
引用:
执行计划贴出来看看……
实际数据有点出入
不过我想你能明白

[其他解释]
引用:
引用:引用:执行计划贴出来看看……实际数据有点出入
不过我想你能明白你这个执行计划是你的还是我的那句?问题在扫描那里,没有用到索引,但是的确你又没有where条件。容易造成扫描。
嗯,看着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%的开销。另外,你和我的哪个块?
[其他解释]



引用:
引用:引用:
引用:引用:执行计划贴出来看看……实际数据有点出入
不过我想你能明白你这个执行计划是你的还是我的那句?问题在扫描那里,没有用到索引,但是的确你又没有where条件。容易造成扫描。嗯,看着61%我想应该是,但都是……

原来如此

以上是你的语句

学习了
[其他解释]
引用:
有没有显示丢失索引?如果在排序那列上做个聚集索引,可以减少排序的那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

[其他解释]
引用:
引用:引用:
有没有显示丢失索引?如果在排序那列上做个聚集索引,可以减少排序的那34%的开销。另外,你和我的哪个块?
你的比较快
介不介意问下,那种GUID(全球唯一标识)形式的列适合做索引吗?以前听说不适合,但是最近在看一本书,由说可以的,但是不要用newid()来产生,而要用NEWSEQU……

哦,学习了

非常感谢! 结贴!

读书人网 >SQL Server

热点推荐