表 a  
  username
    张三
    李四
    王五
   
表 b  filename
    张明
     李四
     赵六然后以表 a 中username为基准 找出filename字段中与username字段相同字的个数查询结果如下:username         filename        num
张三                    张明           1
张三                    李四           0
张三                    赵六           0
李四                    张明           0
李四                    李四           2
李四                    赵六           0
王五                    张明           0
王五                    李四           0
王五                    赵六           0请各位大侠高手帮帮忙!!  

解决方案 »

  1.   

    ---------------------------------
    --  Author: liangCK 小梁
    ---------------------------------
     
    --> 生成测试数据: @tb1
    DECLARE @tb1 TABLE (username VARCHAR(4))
    INSERT INTO @tb1
    SELECT '张三' UNION ALL
    SELECT '李四' UNION ALL
    SELECT '王五'
     
    --> 生成测试数据: @tb2
    DECLARE @tb2 TABLE (filename VARCHAR(4))
    INSERT INTO @tb2
    SELECT '张明' UNION ALL
    SELECT '李四' UNION ALL
    SELECT '赵六'--SQL查询如下:;WITH Liang AS
    (
        SELECT TOP(50)
            ID=ROW_NUMBER() OVER(ORDER BY o.[object_id])
        FROM sys.objects AS o,sys.columns
    ),
    Liang2 AS
    (
        SELECT 
            username,
            SUBSTRING(username,B.ID,1) AS word
        FROM @tb1 AS A
            JOIN Liang AS B
                ON SUBSTRING(A.username,B.ID,1)<>''
    ),
    Liang3 AS
    (
        SELECT 
            A.filename,
            SUBSTRING(filename,B.ID,1) AS word
        FROM @tb2 AS A
            JOIN Liang AS B
                ON SUBSTRING(A.filename,B.ID,1)<>''
    )
    SELECT 
        A.username,
        B.filename,
        SUM(CASE WHEN A.word=B.word THEN 1 ELSE 0 END) AS num
    FROM Liang2 AS A,Liang3 AS B
    GROUP BY A.username,B.filename
    ORDER BY username,filename/*
    username filename num
    -------- -------- -----------
    李四       李四       2
    李四       张明       0
    李四       赵六       0
    王五       李四       0
    王五       张明       0
    王五       赵六       0
    张三       李四       0
    张三       张明       1
    张三       赵六       0(9 行受影响)
    */
      

  2.   

    张三                    张明          1
    因为他们都有一个'张'字!
    只要两个字段记录中有几个相同的字 num字段 显示为 几比如北京市朝阳区      北京市昌平区     4
      

  3.   


    create function f_str(@name1 varchar(20),@name2 varchar(20))
    returns int
    as
    begin
        declare @int int
        set @int=0
        
        while len(@name1)>0 and len(@name2)>0
        begin
            if left(@name1,1)=left(@name2,1)
                set @int=@int+1
            
            select @name1=stuff(@name1,1,1,''),@name2=stuff(@name2,1,1,'')
        end
        
        return @int
    end
    godeclare @a table(username varchar(20))
    insert into @a select '张三'
    insert into @a select '李四'
    insert into @a select '王五'
    declare @b table(filename varchar(20))
    insert into @b select '张明' 
    insert into @b select '李四' 
    insert into @b select '赵六' select *,dbo.f_str(username,filename) as num from @a,@b
    /*
    username             filename             num         
    -------------------- -------------------- ----------- 
    张三                   张明                   1
    李四                   张明                   0
    王五                   张明                   0
    张三                   李四                   0
    李四                   李四                   2
    王五                   李四                   0
    张三                   赵六                   0
    李四                   赵六                   0
    王五                   赵六                   0
    */
    godrop function f_str
    go
      

  4.   


    那就修改一下:
    create function f_str(@name1 varchar(20),@name2 varchar(20))
    returns int
    as
    begin
        declare @int int
        set @int=0
        
        while len(@name1)>0 and len(@name2)>0
        begin
            if charindex(left(@name1,1),@name2)>0
                set @int=@int+1
            
            select @name2=stuff(@name2,charindex(left(@name1,1),@name2),1,''),@name1=stuff(@name1,1,1,'')
        end
        
        return @int
    end
    godeclare @a table(username varchar(20))
    insert into @a select '张三'
    insert into @a select '李四'
    insert into @a select '王五'
    declare @b table(filename varchar(20))
    insert into @b select '三张' 
    insert into @b select '李四' 
    insert into @b select '赵六' select *,dbo.f_str(username,filename) as num from @a a,@b b order by a.username,b.filename
    /*
    username             filename             num         
    -------------------- -------------------- ----------- 
    李四                   李四                   2
    李四                   三张                   0
    李四                   赵六                   0
    王五                   李四                   0
    王五                   三张                   0
    王五                   赵六                   0
    张三                   李四                   0
    张三                   三张                   2
    张三                   赵六                   0
    */
    godrop function f_str
    go
      

  5.   


    IF NOT OBJECT_ID('TB') IS NULL DROP TABLE TB
    GO
    CREATE TABLE TB([USERNAME] NVARCHAR(2))
    Insert tb
    SELECT N'张三' UNION ALL
    SELECT N'李四' UNION ALL
    SELECT N'王五'
    Go 
    IF NOT OBJECT_ID('TC') IS NULL DROP TABLE TC
    GO
    CREATE TABLE TC([FILENAME] NVARCHAR(2))
    Insert tc
    SELECT N'张明' UNION ALL
    SELECT N'李四' UNION ALL
    SELECT N'赵六'
    GoIF NOT OBJECT_ID('F_CHECKF') IS NULL DROP FUNCTION F_CHECKF
    GO
    CREATE FUNCTION F_CHECKF(@USERNAME VARCHAR(20),@FILENAME VARCHAR(20))
    RETURNS INT
    AS
    BEGIN
      DECLARE @STR INT,@RE INT
      SET @RE=0
      WHILE LEN(@USERNAME)>0
      BEGIN
        SET @STR=CHARINDEX(LEFT(@USERNAME,1),@FILENAME)
        IF @STR>0
          SELECT @FILENAME=STUFF(@FILENAME,@STR,1,''),@RE=@RE+1
        SET @USERNAME=STUFF(@USERNAME,1,1,'') 
      END
      RETURN @RE
    END
    GOSELECT *,
    NUM=DBO.F_CHECKF(USERNAME,FILENAME)
    FROM TB
    CROSS JOIN TC/*
    USERNAME FILENAME NUM         
    -------- -------- ----------- 
    张三       张明       1
    李四       张明       0
    王五       张明       0
    张三       李四       0
    李四       李四       2
    王五       李四       0
    张三       赵六       0
    李四       赵六       0
    王五       赵六       0(所影响的行数为 9 行)*/
      

  6.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_count]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_count]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[a]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[a]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[b') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[b]
    GOcreate function f_count(@username varchar(100),@filename varchar(100))
    returns int
    as
    begin
    declare @len int,@temp int,@count int
    select @temp=1,@count=0
    if(len(@username)<=len(@filename)) set @len=len(@username)
    else set @len=len(@filename) while(@temp<=@len)
    begin
    if(substring(@username,@temp,1)=substring(@filename,@temp,1))
    set @count=@count+1 set @temp=@temp+1 end

    return @count
    end
    gocreate table a(username varchar(10))
    insert a select '张三'
    insert a select '李四'
    insert a select '王五'
    gocreate table b([filename] varchar(10))
    insert b select '张明'
    insert b select '李四'
    insert b select '赵六'
    goselect * from a
    select * from bselect username,[filename],[count]=dbo.f_count(username,[filename])
    from a cross join bdrop table a,b
    drop function dbo.f_count/*(所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)username   
    ---------- 
    张三
    李四
    王五(所影响的行数为 3 行)filename   
    ---------- 
    张明
    李四
    赵六(所影响的行数为 3 行)username   filename   count       
    ---------- ---------- ----------- 
    张三         张明         1
    李四         张明         0
    王五         张明         0
    张三         李四         0
    李四         李四         2
    王五         李四         0
    张三         赵六         0
    李四         赵六         0
    王五         赵六         0(所影响的行数为 9 行)*/
      

  7.   

    ------------------------------------------------------------------------
    -- Author:  happyflystone  
    -- Date  :  2009-02-12 16:58:33
    -- Ver:     Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
    --       Apr 14 2006 01:12:25 
    --       Copyright (c) 1988-2005 Microsoft Corporation
    --       Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
    --      
    -------------------------------------------------------------------------- Test Data: ta
    IF OBJECT_ID('ta') IS NOT NULL 
        DROP TABLE ta
    Go
    CREATE TABLE ta(username NVARCHAR(2))
    Go
    INSERT INTO ta
     SELECT '张三' UNION ALL
     SELECT '李四' UNION ALL
     SELECT '王五' 
    GO
    -- Test Data: tb
    IF OBJECT_ID('tb') IS NOT NULL 
        DROP TABLE tb
    Go
    CREATE TABLE tb(filename NVARCHAR(2))
    Go
    INSERT INTO tb
     SELECT '张明' UNION ALL
     SELECT '李四' UNION ALL
     SELECT '赵六' 
    GO
    --Start
    ;with t
    as
    (select n= row_number() over (order by getdate()) from sys.sysobjects)
    ,t1
    as(
    SELECT 

    FROM
    TA as a
    full join tb as c on 1 =1
    CROSS APPLY (
            SELECT CardID=(
                       SELECT
                           ',' AS [text()]
                       FROM tb,t
                       WHERE charindex(substring(filename,n,1),A.username) > 0 and c.filename = filename
                       FOR XML PATH('')
                   )
        ) AS B
    )
    select username,filename,isnull(len(cardid),0) as num from t1
    --Result:
    /*username filename num
    -------- -------- --------------------
    张三       张明       1
    张三       李四       0
    张三       赵六       0
    李四       张明       0
    李四       李四       2
    李四       赵六       0
    王五       张明       0
    王五       李四       0
    王五       赵六       0(9 行受影响)
    */
    --End