现在有两张表,相关的结构如下:(用的";"号是为了区别数据用的)id   name   arr1  arr2  
101  A-001   1;    1;
102  A-002   1;2;  1;
103  A-003   3;    3;
104  A-004   4;    3;4;
id   text1        text2
1    aaa;bbb;    ccc;ddd;
2    eee;fff;    ggg;hhh;假如现在只知道表二中的id号为1,现需要把表一中所包含有
id号为1的记录全部找出来.显示如下.表二id   表一id   name   arr1  arr2  
  1       101     A-001   1;    1;
  1       102     A-002   1;2;  1;这样的SQL语句要怎么写的,谢谢,我想了N久了,还是想不出..

解决方案 »

  1.   

    select 1 as 表二id,* from 表一 where ';'+arr1  like '%;1;%'
    or ';'+arr2  like '%;1;%'
      

  2.   

    或者楼主希望关联表二select 表二.id as 表二id,
    表一.id as 表一id,
    表一.name,   
    表一.arr1,  
    表一.arr2  
    from 表一,表二 
    where 表二.id=1 and
    (
    ';'+表一.arr1  like '%;'+cast(表二.id as varchar)+';%'
    or ';'+表一.arr2  like '%;'+cast(表二.id as varchar)+';%'
    )
      

  3.   

    select 1 as 表二id,* from 表一 where patindex(';1;%',';'+arr1)>0 or patindex(';1;%',';'+arr2)>0
      

  4.   

    select 1 as 表二id,* from 表一 where patindex(';1;%',';'+arr1)>0 or patindex(';1;%',';'+arr2)>0
      

  5.   

    --创建测试数据
    declare @t1 table(id int,name varchar(10),arr1 varchar(10),arr2 varchar(10))
       insert @t1 select 101,'A-001','1;','1;'
        union all select 102,'A-002','1;2;','1;'
        union all select 103,'A-003','3;','3;'
        union all select 104,'A-004','4;','3;4;'
    declare @t2 table(id int,text1 varchar(20),text2 varchar(20))
       insert @t2 select 1,'aaa;bbb;','ccc;ddd;'
       union all select 2,'eee;fff;','ggg;hhh;'
    --查看测试数据
    select * from @t1 
    select * from @t2 
    --查看结果
    select b.id,a.id,a.name,a.arr1,a.arr2 
          from @t1 a inner join @t2 b 
          on charindex(cast(b.id as varchar),a.arr1)>0 or charindex(cast(b.id as varchar),a.arr2)>0 
    where b.id=1 
    /*id          id          name       arr1       arr2       
    ----------- ----------- ---------- ---------- ---------- 
    1           101         A-001      1;         1;
    1           102         A-002      1;2;       1;(所影响的行数为 2 行)
    */
      

  6.   

    patindex函数,赫,第一次看到它的用法,谢谢,学习收下了...
    PATINDEX
    返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。语法
    PATINDEX ( '%pattern%' , expression ) 参数
    pattern一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式。expression一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。返回类型
    int注释
    PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL;如果数据库兼容级别为 65 或更靠前,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 返回 NULL。示例
    A. 在 PATINDEX 中使用模式
    本示例查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。USE pubs
    GO
    SELECT PATINDEX('%wonderful%', notes)
    FROM titles
    WHERE title_id = 'TC3218'
    GO下面是结果集:----------- 
    46          (1 row(s) affected)
      

  7.   

    奇怪,newid1明明是有数字的,但是这样子一执行就没有纪录了.
    sqlb = "select * from product where arr1 like ';%" & newid1 & ";%'"
    是哪里出错了?谢谢.
    如果去掉";"就可以了.但这样又不好,如果11;的数据,则也会被认为like '% 1 %'.
    sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
      

  8.   

    select b.id 表二id,a.id 表一id,a.name,a.arr1,a.arr2 
    from  表一 a,表二 b 
    where charindex(';'+ltrim(str(b.id)),';'+a.arr1+a.arr2)>0 and b.id=1 
      

  9.   

    奇怪,newid1明明是有数字的,但是这样子一执行就没有纪录了.
    sqlb = "select * from product where arr1 like ';%" & newid1 & ";%'"
    是哪里出错了?谢谢.
    如果去掉";"就可以了.但这样又不好,如果11;的数据,则也会被认为like '% 1 %'.
    sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
    ---------------------------------------------------------------------------
    sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"
      

  10.   

    使用PATINDEX的大哥 为什么要在1的前后加上 ; 啊 麻烦告诉一下好吗?
      

  11.   

    declare @t1 table(id int,name varchar(10),arr1 varchar(10),arr2 varchar(10))
       insert @t1 select 101,'A-001','1;','1;'
        union all select 102,'A-002','11;2;','11;'
        union all select 103,'A-003','3;','3;'
        union all select 104,'A-004','4;','3;4;'
    declare @t2 table(id int,text1 varchar(20),text2 varchar(20))
       insert @t2 select 1,'aaa;bbb;','ccc;ddd;'
       union all select 2,'eee;fff;','ggg;hhh;'
    --select 1 as 表二id,* from @t1 where patindex(';1;%',';'+arr1)>0 or patindex(';1;%',';'+arr2)>0--select *from @t1
    --select *from @t2select 1 as 表二id,* from @t1 a
    where a.arr1 like ('1;%')or a.arr2 like ('1;%') or a.arr1 like (';1%')or a.arr2 like (';1%')
      

  12.   

    谢谢各位.
    因为对like相对熟一点,所以还是想用like.
     
    sqlb = "select * from product where arr1 like '%" & newid1 & "%'"
    因为数据库的原因,现在数据库暂时为ACCESS.但是以上这样子也可以顺利执行.奇怪,如果加上";"号上去,就找不到纪录了:
    sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"是哪里错了?
      

  13.   

    晕,在ACCESS下,patindex\charindex\全部都不用能.
    有没其它办法呢?
      

  14.   

    奇怪,如果加上";"号上去,就找不到纪录了:
    sqlb = "select * from product where arr1 like '%;" & newid1 & ";%'"
    -------------------------------------------------------------------
    sqlb = "select * from product where ';' + arr1 like '%;" & newid1 & ";%'"
      

  15.   

    ORARichard(没钱的日子....)您来了.
    是这样的,现在当表二的id等于1时,如果用";1;"的SQL语句来寻找表一中的arr1的纪录时就会为空,因为arr1里面的纪录是"1;",前面少了一个";".表一
    id   name   arr1  arr2  
    101  A-001   1;    1;
    102  A-002   1;2;  1;
    103  A-003   3;    3;
    104  A-004   4;    3;4;表二
    id   text1        text2
    1    aaa;bbb;    ccc;ddd;
    2    eee;fff;    ggg;hhh;
      

  16.   

    上面的句子不是在arr1前面加了个";"了么。 你试过了没有?
      

  17.   

    YEAR,好像行了.
    奇怪,这加个";"是什么意思啊.
    非常感谢,真的.
      

  18.   

    喔,对了,我前面加个类别判断,再加多一个or arr2的like,这样子可以吗?
    sqlb = "select * from product where srotid=100 and  ';' + arr1 like '%;" & newid1 & ";%' or  ';' + arr2 like '%;" & newid1 & ";%'"
      

  19.   

    在arr1前面加“;”是为了构造出“;1;”这样的元素