怎样查询两个表中同一字段的不同数据值
例如:
A表中的字段a有40000条数据
B表中的字段a有60000条数据,其中的40000条数据跟A表是一样的
怎样能把那不一样的20000条数据查询出来啊?
--建表table1,table2:
1
2
3
4
5
6
7
8
9
|
create
table
table1(id
int
,
name
varchar
(10));
create
table
table2(id
int
,score
int
);
insert
into
table1
select
'1'
,
'lee'
;
insert
into
table1
select
'2'
,
'zhang'
;
insert
into
table1
select
'3'
,
'steve'
;
insert
into
table1
select
'4'
,
'wang'
;
insert
into
table2
select
'1'
,
'90'
;
insert
into
table2
select
'2'
,
'100'
;
insert
into
table2
select
'3'
,
'70'
;
|
如表
-------------------------------------------------
table1
-------------------------------------------------
id name
1 lee
2 zhang
3 steve
4 wang
-------------------------------------------------
table2
-------------------------------------------------
id score
1 90
2 100
3 70
-------------------------------------------------
(1)左向外联接的结果集包括 left outer 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
(2)sql语句
1
|
select
*
from
table1 t1
left
join
table2 t2
on
t1.id = t2.id
|
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 2 100
3 steve 3 70
4 wang null null
------------------------------
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
(3)那么获取差值
1
|
select
*
from
table1 t1
left
join
table2 t2
on
t1.id = t2.id
WHERE
t2.id
is
null
|
-------------结果-------------
id name id score
4 wang null null
------------------------------
下面是工作中实际遇到的情况:
##过滤出0销售人员(即没有销售记录的员工信息列表)。
#销售人员(用户角色中间表)
1
|
select
userid
from
bbscs_role_user
where
roleid =
'sales'
|
# ---> 11条记录
#统计表(用户销售记录表)
1
|
select
refid
from
bbscs_sales_income_stat
where
type = 4
and
month
=
'2012-02'
and
amount != 0
|
# ---> 4条记录
要求为:另外7个销售人员的记录列出来为目的。
##########这个是SQL语句模型 BEGIN##########
1
|
select
*
from
b t2
left
join
a t1
on
t1.a1 = t2.b1
WHERE
t1.a1
is
null
|
#########这个是SQL语句模型 END############
说明:左表是数据多的那个表(基准表如b表)。left join查询。where条件是右边的那个表(a表)某个字段(a1)为Null作为(判断字段)
##将SQL返回结果作为临时表来查询
1
2
3
|
select
*
from
(
select
userid
from
bbscs_role_user
where
roleid =
'sales'
) t2
left
join
(
select
refid
from
bbscs_sales_income_stat
where
type = 4
and
month
=
'2012-02'
and
amount != 0) t1
on
t2.userid = t1.refid
WHERE
t1.refid
is
null
|
# --->7条记录
测试一:
##SQL语句,mysql 查询两个表中不同的值(主要是差值) 这个语句查询还是存在问题。
1
2
|
select
t1.Userid
from
bbscs_role_user t1
left
join
bbscs_sales_income_stat t2
on
t1.userid = t2.refid
and
t1.roleid =
'sales'
and
t2.type = 4
and
t2.
month
=
'2012-02'
and
t2.amount != 0
where
t2.id
is
null
;
|
##表与表,条件与条件独立出来。
# --->18条记录
测试二:
1
2
|
select
t1.Userid
from
bbscs_role_user t1
left
join
bbscs_sales_income_stat t2
on
t1.userid = t2.refid
and
t1.roleid =
'sales'
and
t2.type = 4
and
t2.
month
=
'2012-02'
and
t2.amount != 0
and
t2.id
is
null
|
##where or and 区别
# --->22条记录
###更为强大的临时表查询功能,将以上查询结果作为一个整体放入。
##跟用户部门中间表关联,按部门id排序显示。
1
2
3
|
select
t4.userid
from
(
select
*
from
(
select
userid
from
bbscs_role_user
where
roleid =
'sales'
) t2
left
join
(
select
refid
from
bbscs_sales_income_stat
where
type = 4
and
month
=
'2012-02'
and
amount != 0) t1
on
t2.userid = t1.refid
WHERE
t1.refid
is
null
) t3, bbscs_org_user t4
where
t3.userid = t4.userid
order
by
orgId
|