求一个SQL 语句,应该要用到EXISTS
表A
学号 分数
001 90
002 80
003 70
004 89
表B
学号 分数
001 90
002 90
想把A表中和B表分数不相同,A表中有,B表中没有的都查询出来,预想结果
学号 分数A 分数B
002 80 90
003 70 NULL
004 89 NULL
该如何写好?
[解决办法]
declare @表A table (学号 varchar(3),分数 int)insert into @表Aselect '001',90 union allselect '002',80 union allselect '003',70 union allselect '004',89declare @表B table (学号 varchar(3),分数 int)insert into @表Bselect '001',90 union allselect '002',90select a.学号 , a.分数 as 分数a , b.分数 as 分数bfrom @表a a left join @表b b on a.学号 = b.学号where isnull(a.分数, 0) <> isnull(b.分数, 0)/*学号 分数a 分数b---- ----------- -----------002 80 90003 70 NULL004 89 NULL*/
[解决办法]
這應該用full join
借用葉子兄弟數據
declare @表A table (学号 varchar(3),分数 int)insert into @表Aselect '001',90 union allselect '002',80 union allselect '003',70 union allselect '004',89declare @表B table (学号 varchar(3),分数 int)insert into @表Bselect '001',90 union allselect '002',90SELECT ISNULL(a.学号,b.学号) AS 学号,a.分数,b.分数FROM @表A AS aFULL JOIN @表B AS b ON a.学号=b.学号 WHERE NULLIF(a.分数,b.分数) IS NOT NULL/*学号 分数 分数002 80 90003 70 NULL004 89 NULL*/
[解决办法]
create table a([学号] varchar(10),[分数] int)insert aselect '001' ,90 union allselect '002', 80 union allselect '003' ,70 union allselect '004' ,89create table b([学号] varchar(10),[分数] int)insert bselect '001', 90 union allselect '002', 90goselect o.[学号],o.[分数],u.[分数] from(select a.[学号],a.[分数] from awhere not exists (select 1 from b where a.[学号]=b.[学号] and a.[分数]=b.[分数])) as oleft join b as u on o.[学号]=u.[学号]/*(所影响的行数为 3 行)学号 分数 分数--- --- ----002 80 90003 70 NULL004 89 NULL*/godrop table a,b
[解决办法]
A表中 有,B表中没有的查出来 可以用 except 关键字
select * from A
except
select * from B
[解决办法]
select * from a where not exists(select 1 from b where a.[学号]=[学号] and a.[分数]=[分数])union allselect * from b where not exists(select 1 from a where [学号]=b.[学号] and [分数]=b.[分数])
[解决办法]