gpt4 book ai didi

sql - 哪里有问题

转载 作者:行者123 更新时间:2023-12-04 21:38:23 25 4
gpt4 key购买 nike

我已经在表格中提供了几个表格

主记录

Record ID  Details  Textual Information  
1 AAAAAAA ... some text referring to Oxford St Giles...
2 BBBBBBB ... some text referring Oxford....
3 CCCCCCC ... some text referring to Oxford St Aldate...

和支撑台

地名

Record ID   PlaceName
1 Oxford
1 St
1 Giles
2 Oxford
3 Oxford
3 St
3 Aldate

我希望能够构建一个搜索词,以便我可以输入地名的全部或部分词。例如。如果我输入 'Oxford' 我会得到所有 3 条记录,如果我输入 'Oxford' 和 'Giles' 我只会得到记录 1 - 几乎就像使用 WHERE IN ('Oxford','Giles') 但术语是 ANDed 而不是被或运算?

不知道能不能实现?我尝试了各种子查询都没有成功

我正在使用 SQL Server 2008

我想避免制作全文搜索字段

任何清除迷雾的指示都会非常有帮助。

* 主记录详细信息已更新以避免混淆 *
2 个表之间的唯一链接是记录 ID

** 更新于 ** 11 月 3 日,包含示例表

CREATE TABLE MAIN_RECORD (RecordID int,DocumentRef varchar(100));  
INSERT INTO MAIN_RECORD VALUES (86, 'Doc Referring to William Samuel ADAMS');
INSERT INTO MAIN_RECORD VALUES (87, 'Doc Referring to William JONES');
INSERT INTO MAIN_RECORD VALUES (88, 'Doc Referring to Samuel SMITH');



CREATE TABLE FORENAMES (RecordID int,Forename varchar(25));
INSERT INTO FORENAMES VALUES (86, 'William');
INSERT INTO FORENAMES VALUES (86, 'Samuel');
INSERT INTO FORENAMES VALUES (87, 'William');
INSERT INTO FORENAMES VALUES (88, 'Samuel');

我的初始查询是

SELECT main.[RecordID],main.documentRef  
FROM [MAIN_RECORD] main
INNER JOIN [FORENAMES] fn
ON main.RecordID = fn.RecordID
WHERE fn.ForeName IN ('William')

这很好并返回

RecordID    documentRef  
86 Doc Referring to William Samuel ADAMS
87 Doc Referring to William JONES

与塞缪尔等同上

我的问题是当我在名字搜索字段中有超过 1 个条目时,即

SELECT main.[RecordID],main.documentRef  
FROM [MAIN_RECORD] main
INNER JOIN [FORENAMES] fn
ON main.RecordID = fn.RecordID
WHERE fn.ForeName IN ('William,Samuel')

这不会返回任何内容。

我需要这个来只返回包含 Samuel 和 William 的主记录,即。当搜索词中有多个名称时。
它还需要找到 William Samuel 以及 Samuel William。

从其他人的帖子中,我沿着 DIVISION 的路线走下去并提出以下内容(在 main SELECT 之前放置一些字符串操作):

DECLARE @Forename nvarchar(max)
DECLARE @SQLCommand nvarchar(max)
DECLARE @Number_of_Terms int
SET @Forename = 'William,Samuel'
--SET @Forename = 'Samuel,William'
--SET @Forename = 'William'
--SET @Forename = 'Samuel'
SET @Number_of_Terms = LEN(@Forename) - LEN(REPLACE(@Forename,',',''))+1
SET @Forename = REPLACE(@Forename,',',''',''')

SET @SQLCommand = 'SELECT fr.RecordID FROM dbo.BRS109_FullRecord fr '+
'INNER JOIN dbo.BRS109_Forenames fn '+
'ON fr.RecordID = fn.RecordID '+
'WHERE fr.RecordID = fn.RecordID '+
'AND fn.forename IN ('''+@Forename +''') ' +
' GROUP BY fr.RecordID ' +
' HAVING COUNT(fr.RecordId) = ' + CAST(@Number_of_Terms AS varchar(2)) +
' ORDER BY fr.RecordId'

EXECUTE sp_executesql @SQLCommand

这似乎给了我正在寻找的东西。

非常感谢所有人的贡献,尤其是“Quassnoi”和“onedaywhen”——非常有帮助

最佳答案

SELECT  *
FROM mainrecord mr
WHERE (
SELECT COUNT(*)
FROM placenames pn
WHERE pn.record = mr.record
AND pn.placename IN ('Oxford', 'St', 'Giles')
) = 3

关于sql - 哪里有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com