我有2个表,  表1:CGLB
BM       LB
01 日用品
0102 洗手
010204   擦脸 表2: WZ
WZBM        WZMC
0103789542  牙刷
0102568848  香皂
0102045485  毛巾我要用WZ,CGLB做一个联合查询,查询结果如下:
WZBM        WZMC   LB
0103789542  牙刷   日用品
0102568848  香皂   洗手
0102040585  毛巾   擦脸
要求是:用WZ.WZBM的头几位(不定) 与CGLB.BM 进行比较,相等的话把LB取过来。
具体过程:
比如WZ表中毛巾这条记录,他的WZBM是0102040585,那么先用01去到CGLB里找,找到日用品(01)
然后在用0102到CGLB里找,找到洗手(0102),
然后在用010204到CGLB里找,找到擦脸(010204),
然后在用01020405到CGLB里找,没找到,则 WZ表中毛巾这条记录对应的LB就是擦脸(010204).
依次类推。一句话,就是用WZ.WZBM中最长的能和CGLB.BM匹配的为准。怎么用一个SQL写出来啊?

解决方案 »

  1.   

    一个sql估计不好写吧?存储过程行吗?
      

  2.   

    select wzbm,wzmc,lb from 
    cglb a,(select distinct wzbm,wzmc,max(bm) over(partition by wzbm order by length(bm) desc) bm from wz a,cglb b where instr(wzbm,bm) = 1) b
    where a.bm = b.bm;
      

  3.   

    11:21:49 scott@TUNGKONG> select * from cglb;BM         LB
    ---------- ----------
    01         日用品
    0102       洗手
    010204     擦脸已用时间:  00: 00: 00.00
    11:21:54 scott@TUNGKONG> select * from wz;WZBM       WZMC
    ---------- ----------
    0103789542 牙刷
    0102568848 香皂
    0102040585 毛巾已用时间:  00: 00: 00.01
    11:22:00 scott@TUNGKONG> select wzbm,wzmc,lb from
    11:22:07   2  cglb a,(select distinct wzbm,wzmc,max(bm) over(partition by wzbm order by length(bm) desc) bm from wz a,cglb b where instr(wzbm,bm) = 1) b
    11:22:07   3  where a.bm = b.bm;WZBM       WZMC       LB
    ---------- ---------- ----------
    0103789542 牙刷       日用品
    0102568848 香皂       洗手
    0102040585 毛巾       擦脸已用时间:  00: 00: 00.00
      

  4.   

    select wzbm,wzmc,lb from 
    cglb a,(select distinct wzbm,wzmc,max(bm) over(partition by wzbm order by length(bm) desc) bm from wz a,cglb b where instr(wzbm,bm) = 1) b
    where a.bm = b.bm;