0

File、およびの 3 つのテーブルがWordありWordInstanceます。

CREATE TABLE [dbo].[File](
    [FileId] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nchar](10) NOT NULL)

CREATE TABLE [dbo].[Word](
    [WordId] [int] IDENTITY(1,1) NOT NULL,
    [Word] [nchar](10) NOT NULL,
    [LatestFileId] [int] NOT NULL)

CREATE TABLE [dbo].[WordInstance](
    [WordInstanceId] [int] IDENTITY(1,1) NOT NULL,
    [WordId] [int] NOT NULL,
    [FileId] [int] NOT NULL)

簡潔にするために外部キーを省略していることに注意してください。を指定FileIdすると、指定されFileIdた .

これから始めて、私はそれが機能していないことを知っていますが、そのまま提供されます:

CREATE FUNCTION [dbo].[DoesFileContainLastWord]
(
    @fileId INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @count  INT
    DECLARE @ret    BIT

    SELECT @count = COUNT([tW].[WordId])
    FROM [Word] AS tW
    INNER JOIN [WordInstance] AS tWI 
        ON [tW].[WordId] = [tWI].[WordId]
    INNER JOIN [File] AS tF
        ON [tF].[FileId] = [tW].[LatestFileId]
    WHERE [tF].[FileId] = @fileId

    IF @count > 0
        BEGIN
            SET @ret = 0
        END
    ELSE
        SET @ret = 1

    RETURN @ret

END;
4

1 に答える 1

1

SQL Server 2005 でテスト:

declare @file table (fileid int)
declare @instance table (fileid int,wordid int)
insert into @file (fileid)
select 1 union all select 2
insert into @instance (fileid,wordid) 
select 1,1 
union all select 1,2 
union all select 1,3 
union all select 2,1 
union all select 2,2
declare @fileid int
set @fileid=2
;with fvalues as
(
    select distinct wordid from @instance where fileid=@fileid
)
select case when exists
(
    select * 
    from fvalues v
    inner join @instance i on v.wordid = i.wordid
    and i.fileid<>@fileid
    group by i.fileid
    having count(distinct i.wordid) >= (select count(*) from fvalues)
) 
then cast(1 as bit)
else cast(0 as bit) end

ファイル 1 の単語セットはファイル 2 の適切なスーパーセットであるため、 の場合は0 を返し、 の場合は@fileid=11 を返します。@fileid=2

于 2012-07-18T21:47:30.323 に答える