首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

简略的SQL语句

2013-10-11 
简单的SQL语句/**我想查询表一(tb1)中KPBZy的记录,并且不在表二(tb2)中 或者在表二中但是BZ不为null的

简单的SQL语句


/**
我想查询表一(tb1)中KPBZ='y'的记录,并且
不在表二(tb2)中 或者在表二中但是BZ不为null的记录
*/
DECLARE @TB1 TABLE(DM VARCHAR(10),KPBZ VARCHAR(2))
INSERT INTO @TB1(DM,KPBZ)
SELECT '11-AA','y' UNION ALL
SELECT '22-AA','y' UNION ALL
SELECT '33-AA','y' UNION ALL
SELECT '44-AA','y' UNION ALL
SELECT '55-AA','n'
DECLARE @TB2 TABLE(DM VARCHAR(10),BZ VARCHAR(2))
INSERT INTO @TB2(DM,BZ)
SELECT '11-AA','JF' UNION ALL
SELECT '22-AA',NULL 
--结果应该是:11-AA,33-AA,44-AA
--我用的查询是:
SELECT * FROM @TB1 a --WITH(NOLOCK)
WHERE a.KPBZ='y' 
AND (NOT EXISTS(SELECT TOP(1)1 FROM @TB2 b WHERE a.DM=b.DM) 
OR EXISTS(SELECT TOP(1)1 FROM @TB2 b WHERE a.DM=b.DM AND ISNULL(b.BZ,'')>'')
)
--谁有其他的写法?谢谢,最好效率比这个好。

[解决办法]
select *
from @tb1 
left outer join @TB2 on @TB1.DM = @TB2.DM
where @tb1.KPBZ='y'
and (@tb2.DM is null or @tb2.BZ is not null)
[解决办法]

DECLARE @TB1 TABLE(DM VARCHAR(10),KPBZ VARCHAR(2))
INSERT INTO @TB1(DM,KPBZ)
SELECT '11-AA','y' UNION ALL
SELECT '22-AA','y' UNION ALL
SELECT '33-AA','y' UNION ALL
SELECT '44-AA','y' UNION ALL
SELECT '55-AA','n'
DECLARE @TB2 TABLE(DM VARCHAR(10),BZ VARCHAR(2))
INSERT INTO @TB2(DM,BZ)
SELECT '11-AA','JF' UNION ALL
SELECT '22-AA',NULL 

select * from @tb1 a left join
@tb2 b on a.dm=b.dm and b.bz is not null
where a.kpbz='y' and b.dm is null

跟二楼的差不多。
[解决办法]
我把表变量改为表:

/**
我想查询表一(tb1)中KPBZ='y'的记录,并且
不在表二(tb2)中 或者在表二中但是BZ不为null的记录
*/
create TABLE TB1(DM VARCHAR(10),KPBZ VARCHAR(2))
INSERT INTO TB1(DM,KPBZ)
SELECT '11-AA','y' UNION ALL
SELECT '22-AA','y' UNION ALL
SELECT '33-AA','y' UNION ALL
SELECT '44-AA','y' UNION ALL
SELECT '55-AA','n'

create TABLE TB2 (DM VARCHAR(10),BZ VARCHAR(2))
INSERT INTO TB2(DM,BZ)
SELECT '11-AA','JF' UNION ALL
SELECT '22-AA',NULL 


查询代码:

set statistics time on 
set statistics io on

--你的查询
SELECT * FROM TB1 a --WITH(NOLOCK)
WHERE a.KPBZ='y' 
AND (NOT EXISTS(SELECT TOP(1)1 FROM TB2 b WHERE a.DM=b.DM) 
OR EXISTS(SELECT TOP(1)1 FROM TB2 b WHERE a.DM=b.DM AND ISNULL(b.BZ,'')>'')
)

--我的查询
select *
from
(
select a.DM,
       a.KPBZ,
       
       case when b.dm is null 
                 then 1
            when b.BZ is not null
                 then 1
            else 0
       end flag
from TB1 a
left join TB2 b
        on a.DM = b.DM 
where a.KPBZ = 'y' 
)a
where flag = 1



下面是统计信息:

SQL Server 分析和编译时间: 
   CPU 时间 = 6 毫秒,占用时间 = 6 毫秒。

(3 行受影响)
表 'TB2'。扫描计数 4,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'TB1'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(3 行受影响)
表 'TB2'。扫描计数 1,逻辑读取 4 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'TB1'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。



 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

热点排行