我有以下记录:
create table ft_test1
(
col1 int identity(1,1),
col2 varchar(max)
);
insert into ft_test1 values('John A Henry');
insert into ft_test1 values('Dsouza mak Dee');
insert into ft_test1 values('Smith Ashla Don');
create table ft_test2
(
col1 int identity(1,1),
col2 varchar(max)
);
insert into ft_test2 values('Mak');
insert into ft_test2 values('McKoy Obee Zen');
insert into ft_test2 values('Henry A John');
全文索引设置:
第1步:创建唯一索引
CREATE UNIQUE INDEX UIX_test1_Col1 ON ft_test1(col1);
CREATE UNIQUE INDEX UIX_test2_Col1 ON ft_test2(col1);
第2步:创建目录
CREATE FULLTEXT CATALOG cat_ft
WITH ACCENT_SENSITIVITY = OFF
第3步:创建全文索引
CREATE FULLTEXT INDEX ON ft_test1
(col2 LANGUAGE 1033)
KEY INDEX UIX_test1_Col1
ON cat_ft
WITH STOPLIST = SYSTEM
CREATE FULLTEXT INDEX ON ft_test2
(col2 LANGUAGE 1033)
KEY INDEX UIX_test2_Col1
ON cat_ft
WITH STOPLIST = SYSTEM
查询:我想通过匹配JOIN
的值并返回表col2
的值来在这两个表之间做ft_test1
。
预期输出:
col2
------------
Dsouza mak Dee
John A Henry
关于预期输出的说明:
mak
的两个表中都存在col2
尝试:
SELECT t1.col2
FROM ft_test1 t1
INNER JOIN ft_test2 t2
ON CONTAINS(t2.col2, t1.col2);
错误:
信息102,级别15,状态1,第4行在't1'附近的语法不正确。
答案 0 :(得分:3)
CONTAINS
不能满足您的需求。 FREETEXT
更近,在这种情况下会返回您想要的结果。
您应该检查the documentation,以查看完整的语义是否可接受。
您还需要如下所示的辅助TVF。
CREATE FUNCTION F1(@SearchText VARCHAR(8000))
RETURNS @ft_test2 TABLE (
col1 INT,
col2 VARCHAR(max))
AS
BEGIN
INSERT INTO @ft_test2
SELECT *
FROM ft_test2 t2
WHERE FREETEXT (t2.col2, @SearchText)
RETURN
END
GO
SELECT t1.col2
FROM ft_test1 t1
CROSS APPLY F1(t1.col2)
答案 1 :(得分:1)
使用ft_test2建立搜索字词:
Declare @vals varchar(1000) = '';
Select @Vals = @Vals + Case When @Vals = '' Then '"'+col2+'"' Else ' OR ' + '"'+col2+'"' End
From ft_test2;
Select * From ft_test1 where FreeText(col2, @Vals);