又是SQL,好怕,自己基础又薄弱,只有再次请教高手了,谢谢.表一:
id sortid
10  亚洲
11  欧洲
12  美洲表二:
id   srotid  name   arr1  arr2  
101    10    A-001   1;    1;
102    10    A-002   1;2;  1;
103    11    A-003   3;    3;
104    11    A-004   4;    3;4;表三:
id   text1        text2
1    aaa;bbb;    ccc;ddd;
2    eee;fff;    ggg;hhh;
现在假如客户输入"亚洲 aaa"我要搜索出以下纪录:(注:因为arr1与arr2里面含有记录表三中的含有"aaa"的ID号,此例表三中含有"aaa"的ID号为1。对了,还需要考虑模糊搜索.)id   srotid  name   arr1  arr2  
101    10    A-001   1;    1;
102    10    A-002   1;2;  1;
再次谢谢了.

解决方案 »

  1.   

    ljsql(第 1 行: '脑子' 附近有语法错误。) 
    没看明白这个和表3有什么关系
    谢谢你呀,中午你刚把我解决了一个大难题。
    这个下面显示的结果中的arr1、arr2里面所含有的1,就是表三中含有"aaa"的ID号。
    id   srotid  name   arr1  arr2  
    101    10    A-001   1;    1;
    102    10    A-002   1;2;  1;
      

  2.   

    select b.* 
    from tb1 a,tb2 b,tb3 c
    where a.id=b.srotid and 
    (';'+c.id like '%;'+b.arr1+';%' or ';'+c.id like '%;'+b.arr2+';%') and 
    a.sortid='亚洲' and 
    (';'+'aaa'+';' like '%;'+c.text1+';%' or ';'+'aaa'+';' like ''%;'+c.text2+';%')
      

  3.   

    --创建测试环境
    Create Table 表一
    (id Int,
     sortid Nvarchar(10))
    Insert 表一 Select 10,  N'亚洲'
    Union All Select 11,  N'欧洲'
    Union All Select 12,  N'美洲'Create Table 表二
    (id Int,
     sortid Int,
     name Varchar(10),
     arr1 Varchar(20),
     arr2 Varchar(20))
    Insert 表二 Select 101,    10,    'A-001',   '1;',    '1;'
    Union All Select 102,    10,    'A-002',   '1;2;', '1;'
    Union All Select 103,    11,    'A-003',   '3;',    '3;'
    Union All Select 104,    11,    'A-004',   '4;',    '3;4;'Create Table 表三
    (id Int,
     text1 Varchar(20),
     text2 Varchar(20))
    Insert 表三 Select 1,    'aaa;bbb;',    'ccc;ddd;'
    Union All Select 2,    'eee;fff;',      'ggg;hhh;'
    GO
    --测试
    Select B.*
    From 表一 A 
    Inner Join 表二 B On A.id = B.sortid
    Inner Join 表三 C On (';' + B.arr1 Like '%;' + Cast(C.id As Varchar) + ';%') And (';' + B.arr2 Like '%;' + Cast(C.id As Varchar) + ';%')
    Where A.sortid = N'亚洲' And (';' + C.text1 Like '%;' + 'aaa' + ';%' Or ';' + C.text2 Like '%;' + 'aaa' + ';%')
    GO
    --删除测试环境
    Drop Table 表一, 表二, 表三
    --结果
    /*
    id sortid name arr1 arr2
    101 10 A-001 1; 1;
    102 10 A-002 1;2; 1;
    */
      

  4.   


    '函数名:keyword_sousuo 
    '作 用:生成sql查询条件 
    '参 数:table_field ------ 表的字段名(之间用逗号分开) 
    ' keyword ------ 搜索关键词(之间用空格分开) 
    '返 回:sql查询条件 
    '================================================== 
    function keyword_sousuo(byval table_field,byval keyword) 
     dim str01,str02,keywords,table_fields,i,j 
      table_fields=split(trim(table_field),",") 
      keywords=split(trim(keyword),",") 
      if table_field<>"" then 
       str01="("&table_fields(0)&" like '%"&keyword&"%'" 
       for j=0 to ubound(table_fields) 
       str01=str01&" or "&table_fields(j)&" like '%"&keyword&"%'" 
       next 
       str01=str01&")" 
      else 
       response.Write("<script>alert('参数错误(不能为空)!')</script>") 
       response.End() 
      end if 
     '全角--》半角 空格 
     'keyword=replace(keyword," "," ") 
     'while InStr(keyword," ")>0 
     ' keyword=replace(keyword," "," ") 
     'wend 
     keywords=split(keyword," ") 
     if ubound(keywords)>0 then 
     for i=0 to ubound(keywords) 
       str02=str02&"("&table_fields(0)&" like '%"&keywords(i)&"%'" 
       for j=1 to ubound(table_fields) 
       str02=str02&" or "&table_fields(j)&" like '%"&keywords(i)&"%'" 
       next 
       str02=str02&")" 
     next 
     str02="("&replace(str02,")(",")and(")&")" 
     keyword_sousuo="(" & str01 & "or" & str02 & ")" 
     else 
     keyword_sousuo=str01 
     end if 
    end function 
    '================================================== '调用时用相关的字段传送过去就可以了;sql_where=keyword_sousuo("title,cz,name,time",keyword) 
    conn.Open ConnectString
    rs.Open sql_where, conn, 1, 1谢谢您们!
    找了N久,终于找到了这个支持模糊搜索的函数,试了一下感觉还不错.
    现在有一个好大的问题,就是能否把我上面要求的SQL语句引入进来用.
    偶从早上试到现在,看得头都晕了,还是不行.
    没办法,只好再提出来,真的不想再烦大家了,有点过意不去,还请见谅.
    谢谢.
      

  5.   


    '函数名:keyword_sousuo 
    '作 用:生成sql查询条件 
    '参 数:table_field ------ 表的字段名(之间用逗号分开) 
    ' keyword ------ 搜索关键词(之间用空格分开) 
    '返 回:sql查询条件 
    '================================================== 
    function keyword_sousuo(byval table_field,byval keyword) 
     dim str01,str02,keywords,table_fields,i,j 
      table_fields=split(trim(table_field),",") 
      keywords=split(trim(keyword),",") 
      if table_field<>"" then 
       str01="("&table_fields(0)&" like '%"&keyword&"%'" 
       for j=0 to ubound(table_fields) 
       str01=str01&" or "&table_fields(j)&" like '%"&keyword&"%'" 
       next 
       str01=str01&")" 
      else 
       response.Write("<script>alert('参数错误(不能为空)!')</script>") 
       response.End() 
      end if 
     '全角--》半角 空格 
     'keyword=replace(keyword," "," ") 
     'while InStr(keyword," ")>0 
     ' keyword=replace(keyword," "," ") 
     'wend 
     keywords=split(keyword," ") 
     if ubound(keywords)>0 then 
     for i=0 to ubound(keywords) 
       str02=str02&"("&table_fields(0)&" like '%"&keywords(i)&"%'" 
       for j=1 to ubound(table_fields) 
       str02=str02&" or "&table_fields(j)&" like '%"&keywords(i)&"%'" 
       next 
       str02=str02&")" 
     next 
     str02="("&replace(str02,")(",")and(")&")" 
     keyword_sousuo="(" & str01 & "or" & str02 & ")" 
     else 
     keyword_sousuo=str01 
     end if 
    end function 
    '================================================== '调用时用相关的字段传送过去就可以了;sql_where=keyword_sousuo("title,cz,name,time",keyword) 
    conn.Open ConnectString
    rs.Open sql_where, conn, 1, 1谢谢您们!
    找了N久,终于找到了这个支持模糊搜索的函数,试了一下感觉还不错.
    现在有一个好大的问题,就是能否把我上面要求的SQL语句引入进来用.
    偶从早上试到现在,看得头都晕了,还是不行.
    没办法,只好再提出来,真的不想再烦大家了,有点过意不去,还请见谅.
    谢谢.
      

  6.   

    ---表二的arr1  arr2  都要含有表三的id的话
    select b.*
    from 表一 a
    inner join 表二 b on a.id=b.sortid
    inner join 表三 c on charindex(cast(c.id as varchar),b.arr1)>0 and charindex(cast(c.id as varchar),b.arr2)>0
    where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')---表二的arr1  arr2  两者只要有含表三的id的话
    select b.*
    from 表一 a
    inner join 表二 b on a.id=b.sortid
    inner join 表三 c on charindex(cast(c.id as varchar),b.arr1)>0 or charindex(cast(c.id as varchar),b.arr2)>0
    where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')
      

  7.   

    怎么不支持啊!
    where a.sortid = '亚洲' And (';' + c.text1 Like '%;' + 'aaa' + ';%' Or ';' + c.text2 Like '%;' + 'aaa' + ';%')
    你把aaa改成eee再试试看
      

  8.   

    是这样,用户一般是输入"亚洲 aaa"这一整句来进行模糊搜索的.
      

  9.   

    /*假如lz在软件里做查询模块的话
    我想你的设置不合理,建议用两个条件较合理些,如亚洲 下有aaa和bbb 
    输入亚洲aaa 这样的查询我没有做过
    呵呵我觉得与你的数据库设置不太合理*/
    条件1     条件2
    亚洲      aaa
              bbb 
    --------------
    欧洲      ccc
              ddd
    -------------
    美洲      eee
              fff
      

  10.   

    因为现在数据库暂时为Access,所以有一些函数不支持.
    我用这句来执行,为什么也有语法错误.
    select b.* 
    from tb1 a,tb2 b,tb3 c
    where a.id=b.srotid and 
    (';'+c.id like '%;'+b.arr1+';%' or ';'+c.id like '%;'+b.arr2+';%') and 
    a.sortid='亚洲' and 
    (';'+'aaa'+';' like '%;'+c.text1+';%' or ';'+'aaa'+';' like ''%;'+c.text2+';%')
      

  11.   

    --try this one outselect b.* 
    from tb1 a,tb2 b,tb3 c
    where a.id=b.srotid and 
    (';'+b.arr1+';' like '%;'+c.id+'%' or ';'+b.arr2+';' like '%;'+c.id+'%') and 
    a.sortid='亚洲' and 
    (';'+c.text1 like '%;'+'eee'+';%' or ';'+c.text2+';' like '%;'+'eee'+'%')
      

  12.   

    ORARichard(没钱的日子......) ,谢谢您.
    又提示这个:标准表达式中数据类型不匹配奇怪..55
      

  13.   

    c.id --> ltrim(str(c.id))
      

  14.   

    ORARichard(没钱的日子......) 谢谢您.
    这个不会提示这个错误,但是却找不到纪录,数据库里明明有存的.
    您也早点休息了,明天有时间再来了,我也晕了一天了.
      

  15.   

    Access里应该把%换成*
    再试试看
      

  16.   

    喔,我是用ADO连接的,应该不用的.呀.
      

  17.   

    try,ACCESS中Select B.*
    From 表一 A 
    Inner Join 表二 B On A.id = B.sortid
    Inner Join 表三 C On (';' + B.arr1 Like '*;' + Cast(C.id As Varchar) + ';*') Or (';' + B.arr2 Like '*;' + Cast(C.id As Varchar) + ';*')
    Where A.sortid = N'亚洲' And (';' + C.text1 Like '*;' + 'aaa' + ';*' Or ';' + C.text2 Like '*;' + 'aaa' + ';*')
      

  18.   

    呵呵
    按LZ的意思,只有是ADO连接的
    代码是不是在SQL,ACCESS,ORACLE里都可以通用吗?
    肯定不行啊...