请看下面两段代码
先说说表结构:
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,得出的每条结果总是会有一条重复的,这难道是笛卡儿乘积?
望各位大大给我指点迷津................. 

解决方案 »

  1.   

    用这个试试
    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
      

  2.   

    上面错了,应该是
    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
      

  3.   

    a.acc_nbr=b.acc_nbr--不是一一對應的值,也就是存在多值
      

  4.   

    是笛卡儿乘积
    因為你是select *
    即顯示出2個表的所有字段,用樓上的應該對了
      

  5.   

    a.acc_nbr=b.acc_nbr--不是一一對應的值,也就是存在多值----------------------------
    不是一一对应是什么意思?
    acc_nbr  在每个表中,都是唯一的啊,没有相同的值
      

  6.   

    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
      

  7.   

    roy_88(中国风_燃烧你的激情!!!) 
    a.acc_nbr=b.acc_nbr--不是一一對應的值,也就是存在多值正确,应该是这样的问题。
       而且如果你在表中再多加一些数据 用可能不只是 X2 或许出现更多的数据/
      

  8.   

    acc_nbr 在每个表中是一一对应的值
    还有,我的出错具体情况,请看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
      

  9.   

    --問題在於你不同的flag有多個acc_nbr;若同一個flag的acc_nbr唯一,則下面的沒問題select 
    *
    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
      

  10.   

    --樓主用下面查詢一下看看有沒有記錄,我想應該用重復記錄的
    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
      

  11.   

    使用了on条件中与left连接有密切的联系,查查你的数据你就会明白了,为什么会出现你说的情况!
    第二种没有使用left所以没有冗余数据!
      

  12.   

    其实我的表里,还不只 acc_nbr,serv_name,flag 这3个字段 ,还有其他很多个字段
    其他的字段在不同的记录里都会有重复的,只有acc_nbr 这个字段,在不同的记录里,就是不同的我执行了一下你的 结果是:(所影响的行数为 0 行)
    (所影响的行数为 54700 行)即上面哪句的结果是0行,下面的是54700行
      

  13.   

    完了,我知道我的问题在哪了
    我的表是从dbf表导入的
    我在导入 serv2表的时候,可能导入了两次
    导致serv2表里的每条记都多了一条重复的!
    竟然是这样 傻X的情况造成的,麻烦各位大大了
    每个人都有分得!
      

  14.   

    你的表中沒有主鍵嗎?如果有主鍵,重復的數據應該不可能導入進去的。既然acc_nbr是唯一的,將這個字段設為主鍵吧,這樣以後就不會有這樣的問題了。
      

  15.   

    恩,我还真的没有去设置主键
    刚刚去设置了一下,其他的表都可以把acc_nbr 设置主键,而就是serv2这个表设置不了
    呵呵,人粗心呀
      

  16.   

    你用這段代碼將serv2中的重復數據刪除掉Select Distinct * Into #T From serv2
    Delete From serv2
    Insert serv2 Select * From #T
    Drop Table #T然後就可以設置acc_nbr為主键了。