select A.colname1,a.colname2,b.colname4 from A INNER JOIN B on A.colname1=B.colname1 where a.colname1 in (select b.colname1 from b union all select b.colname2 from b union all select b.colname3 from b);

解决方案 »

  1.   

    可是我的INNER JOIN B on A.colname1=B.colname1 也就要改了呀:)
      

  2.   

    select a.colname1,a.colname2,b.colname4
      from a, b
     where a.colname1 = b.colname1
        or a.colname1 = b.colname2
        or a.colname1 = b.colname3
    /
       
      

  3.   

    呵,谢谢!我一直想用join,所以没想到三千的方法:)
    现在还有一个问题,我A有个id(有重复),colname1,B有个id(无重复),colname1,colname2,colname3,colname4,
    我要把A的colname1的值放到C的id(无重复),colname1,colname2,colname3,colname4中,
    判断就是,如 b.colname1-2<A.colname1<b.colname1+1就放到C.colname1,b.colname2<A.colname1<b.colname3时,小的放到C.colname2,大的放到C.colname3,b.colname4-1<A.colname1<b.colname4+3就放到C.colname4?
      

  4.   

    写是可以的,不过你的逻辑不是很清楚,
    1. A和B通过ID相连吗?
    2. "b.colname2<A.colname1<b.colname3时,小的放到C.colname2,大的放到C.colname3"看不明白,什么是大/小的标准?
    3. 如果A中找不到符合标准的值,是不是用B中的值?
      

  5.   

    三千说得不错,“b.colname2<A.colname1<b.colname3时,小的放到C.colname2,大的放到C.colname3”这句话确实有问题,既然你要把A的colname1的值按条件分别放到C的colname1~4中,那么上面这一句条件只能判断出a.colname1是否在区间段内,又何从比较其自身的大小呢?
      

  6.   

    1.A和B通过ID相连:)
    2.b.colname2<A.colname1<b.colname3时,因为A.Colname1的记录数大于4 个,而且多个符合b.colname2<A.colname1<b.colname3时小的放到C.colname2,大的放到C.colname3
    3.A中找不到符合标准的值,C中为空!
      

  7.   

    INSERT INTO C
    select id,
           (select min(colname1) from a a1
             where a1.colname1 > b.colname1 - 2
               and a1.colname1 < b.colname1 + 1) colname1,
           (select min(colname1) from a a2
             where a2.colname1 > b.colname2
               and a2.colname1 < b.colname3) colname2,
           (select max(colname1) from a a3
             where a3.colname1 > b.colname2
               and a3.colname1 < b.colname3) colname3,
           (select min(colname1) from a a4
             where a4.colname1 > b.colname4 - 1
               and a4.colname1 < b.colname4 +3) colname4
      from b
    /大概就是这样吧,只要你能保证在你说的特殊情况纪录数超过一条.
      

  8.   

    SELECT SUBSTRING(A.OUTTXT, 4, 4) 
          + '/' + SUBSTRING(A.OUTTXT, 8, 2) 
          + '/' + SUBSTRING(A.OUTTXT, 10, 2) AS readdate, 
          SUBSTRING(A.OUTTXT, 12, 2) 
          + ':' + SUBSTRING(A.OUTTXT, 14, 2) 
          + ':' + SUBSTRING(A.OUTTXT, 16, 2) AS readtime, 
          SUBSTRING(A.OUTTXT, 18, 10) AS cardnumber, B.ManID, 
          C.ManName, C.WorkTime
    FROM dbo.ManData INNER JOIN
          B ON C.ManID = B.ManID CROSS JOIN
          A
    WHERE (SUBSTRING(A.OUTTXT, 18, 10) = B.CardNumber OR
          SUBSTRING(A.OUTTXT, 18, 10) = B.CardNumber1 OR
          SUBSTRING(A.OUTTXT, 18, 10) = B.CardNumber2 OR
          SUBSTRING(A.OUTTXT, 18, 10) = B.CardNumber3 OR
          SUBSTRING(A.OUTTXT, 18, 10) = B.CardNumber4) AND 
          (B.ManID IN
              (SELECT manid
             FROM C))
    能再优化吗?A中60万条,B中1万条,C中1万条,我居然用了10分钟多没出来:(
    机器P3-800,256M:(
      

  9.   

    呵,如果A有个id(有重复),colname1,B有个id(无重复),colname1,colname2,colname3,colname4,
    我要把A的colname1的值放到C的id(无重复),colname1,colname2,colname3,colname4中,
    判断就是,如 b.colname1-2<A.colname1<b.colname1+1就放到C.colname1,b.colname2<A.colname1<b.colname3时,小的放到C.colname2,大的放到C.colname3,b.colname4-1<A.colname1<b.colname4+3就放到C.colname4? 
    这个问题如果我有个前题,当A中ID的count=2时,就把小的放到C.colname1,大的放到C.colname2,再实行上面的规则呢?
      

  10.   

    不是已经回了吗?思路已经在那里了,你自己稍微改一下不行吗?“当A中ID的count=2时,就把小的放到C.colname1,大的放到C.colname2,再实行上面的规则呢”,但是如果只有一条呢?怎么办?你说明逻辑的时候最好把所有的情况都说清楚,不要老是问一点说一点。这段时间我不是很忙,否则恐怕没那么多时间一点点问。另外,你的那段SQL中的条件都是用的函数,索引没办法用,再加上那么多OR,OR操作是最慢的逻辑操作,恐怕效率是很难提高了。
      

  11.   

    5555555
    那就是说这段SQL没法加快速度了?
      

  12.   

    select 
      A.colname1,
      a.colname2,
      b.colname4 
    from 
      A 
    INNER JOIN (
      select 
        colname1 as colname1
      from b
      union
      select 
        colname2 as colname1
      from b
      union
      select
        colname3 as colname1
      from b) b on A.colname1=B.colname1