请看下面两段代码
先说说表结构:
serv3是3月份用户资料表
serv2是2月份用户资料表
acc_nbr 是用户号码,在表中是唯一的,没有相同的记录
serv_state 是用户状态,他的值大都相同,只有少数不同再看下面两段代码:
select
*
from serv3 a left join serv2 b
on a.acc_nbr=b.acc_nbr
where
a.serv_type_ in (1010,1000)
and a.serv_state='F1A'
and b.serv_state='F1S'
order by a.acc_nbr
有44条记录
---------------------select * from serv3
where serv_state='F1A'
and acc_nbr in (select acc_nbr from serv2 where serv_state='F1S')
and serv_type_ in (1010,1000)
order by acc_nbr
有22条记录有22条记录的这个是我要的正确结果。
再仔细看有44条记录的结果里面,每条记录都有一条重复的记录。
我知道,如果在第一段代码中添加 distinct ,就可以显示正确的22条记录,但我不知道为何
我不加distinct,得出的每条结果总是会有一条重复的,这难道是笛卡儿乘积?
望各位大大给我指点迷津.................
先说说表结构:
serv3是3月份用户资料表
serv2是2月份用户资料表
acc_nbr 是用户号码,在表中是唯一的,没有相同的记录
serv_state 是用户状态,他的值大都相同,只有少数不同再看下面两段代码:
select
*
from serv3 a left join serv2 b
on a.acc_nbr=b.acc_nbr
where
a.serv_type_ in (1010,1000)
and a.serv_state='F1A'
and b.serv_state='F1S'
order by a.acc_nbr
有44条记录
---------------------select * from serv3
where serv_state='F1A'
and acc_nbr in (select acc_nbr from serv2 where serv_state='F1S')
and serv_type_ in (1010,1000)
order by acc_nbr
有22条记录有22条记录的这个是我要的正确结果。
再仔细看有44条记录的结果里面,每条记录都有一条重复的记录。
我知道,如果在第一段代码中添加 distinct ,就可以显示正确的22条记录,但我不知道为何
我不加distinct,得出的每条结果总是会有一条重复的,这难道是笛卡儿乘积?
望各位大大给我指点迷津.................
select
serv3.*
from serv3 a left join serv2 b
on a.acc_nbr=b.acc_nbr
where
a.serv_type_ in (1010,1000)
and a.serv_state='F1A'
and b.serv_state='F1S'
order by a.acc_nbr
select
a.*
from serv3 a left join serv2 b
on a.acc_nbr=b.acc_nbr
where
a.serv_type_ in (1010,1000)
and a.serv_state='F1A'
and b.serv_state='F1S'
order by a.acc_nbr
因為你是select *
即顯示出2個表的所有字段,用樓上的應該對了
不是一一对应是什么意思?
acc_nbr 在每个表中,都是唯一的啊,没有相同的值
我现在的问题是,现在的结果,每条记录,会出现两条记录, 就好像是下面这样:
acc_nbr serv_name flag acc_nbr serv_name flag
55555 张三 2 55555 张三 2
55555 张三 2 55555 张三 2
66666 李四 3 66666 李四 3
66666 李四 3 66666 李四 3而我要的结果只是:acc_nbr serv_name flag acc_nbr serv_name flag
55555 张三 2 55555 张三 2
66666 李四 3 66666 李四 3
a.acc_nbr=b.acc_nbr--不是一一對應的值,也就是存在多值正确,应该是这样的问题。
而且如果你在表中再多加一些数据 用可能不只是 X2 或许出现更多的数据/
还有,我的出错具体情况,请看7楼 ,也就是下面的:
---------------------------------------
select * 是两个表的字段,不过这两个表的字段都是连接在一起的,也就是在同一条记录上显示,这是没问题的
我现在的问题是,现在的结果,每条记录,会出现两条记录, 就好像是下面这样:
acc_nbr serv_name flag acc_nbr serv_name flag
55555 张三 2 55555 张三 2
55555 张三 2 55555 张三 2
66666 李四 3 66666 李四 3
66666 李四 3 66666 李四 3而我要的结果只是:acc_nbr serv_name flag acc_nbr serv_name flag
55555 张三 2 55555 张三 2
66666 李四 3 66666 李四 3
*
from serv3 a left join serv2 b
on a.acc_nbr=b.acc_nbr and a.flag=b.flag
where
a.serv_type_ in (1010,1000)
and a.serv_state='F1A'
and b.serv_state='F1S'
order by a.acc_nbr
select acc_nbr from serv3 group by acc_nbr having count(acc_nbr)>1select acc_nbr from serv2 group by acc_nbr having count(acc_nbr)>1
第二种没有使用left所以没有冗余数据!
其他的字段在不同的记录里都会有重复的,只有acc_nbr 这个字段,在不同的记录里,就是不同的我执行了一下你的 结果是:(所影响的行数为 0 行)
(所影响的行数为 54700 行)即上面哪句的结果是0行,下面的是54700行
我的表是从dbf表导入的
我在导入 serv2表的时候,可能导入了两次
导致serv2表里的每条记都多了一条重复的!
竟然是这样 傻X的情况造成的,麻烦各位大大了
每个人都有分得!
刚刚去设置了一下,其他的表都可以把acc_nbr 设置主键,而就是serv2这个表设置不了
呵呵,人粗心呀
Delete From serv2
Insert serv2 Select * From #T
Drop Table #T然後就可以設置acc_nbr為主键了。