表结构实体NEntity
eid int pk
title nvarchar(50)类型EType
id int pk
tName nvarchar(50)关系表Rel_Entity
entityId int pk
etypeId int pk实体与类型的关系:1:N现在要求模糊查询,title及关联的类型名称也要模糊查询现在有2种思路:1.查询出一个临时表,在其上面模糊查询。
临时表
eid title tNames(将类型名称合并成一个字段)
1    aaa  a,f,d
2    vds  a
……
这个怎么查询出来呢?2.三表查询
select eid,title,tName from NEntity,Rel_Entity,EType where entityId = eid and id = etypeId
会有重复的。大家还有没有更好的方法。可以保证模糊查询的效率和准确性。

解决方案 »

  1.   

    合并列值 
    --*******************************************************************************************
    表结构,数据如下: 
    id    value 
    ----- ------ 
    1    aa 
    1    bb 
    2    aaa 
    2    bbb 
    2    ccc 需要得到结果: 
    id    values 
    ------ ----------- 
    1      aa,bb 
    2      aaa,bbb,ccc 
    即:group by id, 求 value 的和(字符串相加) 1. 旧的解决方法(在sql server 2000中只能用函数解决。) 
    --=============================================================================
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    --1. 创建处理函数 
    CREATE FUNCTION dbo.f_strUnite(@id int) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + value FROM tb WHERE id=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id 
    drop table tb 
    drop function dbo.f_strUnite 
    go
    /* 
    id          value      
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc 
    (所影响的行数为 2 行) 
    */ 
    --===================================================================================
    2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。) 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    -- 查询处理 
    SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY( 
            SELECT [values]= STUFF(REPLACE(REPLACE( 
                ( 
                    SELECT value FROM tb N 
                    WHERE id = A.id 
                    FOR XML AUTO 
                ), '<N value="', ','), '"/>', ''), 1, 1, '') 
    )N 
    drop table tb /* 
    id          values 
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 行受影响) 
    */ --SQL2005中的方法2 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '') 
    from tb 
    group by id /* 
    id          values 
    ----------- -------------------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 row(s) affected) */ drop table tb 
      

  2.   

    '分组合并字段值问题,参考如下:'
    /*
    数据库表如下
    时间 员工 班别
    2010-04-23 王梅 早班
    2010-04-25 周晓丽 晚班
    2010-04-25 刘燕 晚班
    2010-04-25 王梅 晚班
    2010-04-23 明月 早班
    2010-04-24 陈红云 早班
    2010-04-24 孙红梅 早班
    2010-04-24 刘燕 早班
    2010-04-23 孙红梅 早班
    2010-04-23 陈红云 早班
    我想显示成这样的请问怎么做?
    时间        早班                        中班    晚班
    --------------------------------------------------------------
    2010-04-23     王梅,明月,孙红梅,陈红云  NULL    NULL
    2010-04-24     陈红云,孙红梅,刘燕       NULL    NULL
    2010-04-25     NULL                     NULL    周晓丽,刘燕,王梅*/
    --------------------SQL Server数据格式化工具-------------------
    ---------------------------------------------------------------
    -- DESIGNER :happycell188(喜喜)
    --       QQ :584738179
    -- Development Tool :Microsoft Visual C++ 6.0    C Language 
    -- FUNCTION :CONVERT DATA TO T-SQL
    ---------------------------------------------------------------
    -- Microsoft SQL Server  2005
    -- Developer Edition on Microsoft Windows XP [版本 5.1.2600]
    ---------------------------------------------------------------
    ---------------------------------------------------------------use test
    go
    if object_id('test.dbo.tb') is not null drop table tb
    -- 创建数据表
    create table tb
    (
    时间 char(11),
    员工 char(7),
    班别 char(5)
    )
    go
    --插入测试数据
    insert into tb select '2010-04-23','王梅','早班'
    union all select '2010-04-25','周晓丽','晚班'
    union all select '2010-04-25','刘燕','晚班'
    union all select '2010-04-25','王梅','晚班'
    union all select '2010-04-23','明月','早班'
    union all select '2010-04-24','陈红云','早班'
    union all select '2010-04-24','孙红梅','早班'
    union all select '2010-04-24','刘燕','早班'
    union all select '2010-04-23','孙红梅','早班'
    union all select '2010-04-23','陈红云','早班'
    go
    --代码实现select 时间,早班=case 班别 when '早班' then temp end,
    中班=case 班别 when '中班' then temp end,
    晚班=case 班别 when '晚班' then temp end
    from (
    select 时间,班别,
    temp=stuff((select ','+rtrim(员工) from tb where 时间=t.时间 for xml path('')),1,1,'') from tb t
    group by 时间,班别 )t/*测试结果时间        早班                        中班    晚班
    --------------------------------------------------------------
    2010-04-23     王梅,明月,孙红梅,陈红云  NULL    NULL
    2010-04-24     陈红云,孙红梅,刘燕       NULL    NULL
    2010-04-25     NULL                     NULL    周晓丽,刘燕,王梅(3 行受影响)
    */
      

  3.   

    '2.三表查询
    SQL codeselect eid,title,tName from NEntity,Rel_Entity,EType where entityId = eid and id = etypeId会有重复的。大家还有没有更好的方法。可以保证模糊查询的效率和准确性。'有重复的就去重...