如何循环浏览一个表,使用该数据进行搜索,然后将搜索条件和结果返回到新表



我有一组记录需要在SQL表中进行验证(搜索(。我将分别调用这些ValData和SearchTable。一位同事创建了一个SQL查询,其中可以将ValData中的记录复制并粘贴到字符串变量中,然后在SearchTable中进行搜索。将返回SearchTable的最佳结果。这个效果很好。

我想把这个过程自动化。我将ValData加载到SQL的表中,如下所示:RowID INT、名字、姓氏、出生日期、日期1、日期2、文本描述。

我想按RowID循环浏览这组数据,然后创建一个结果表,该结果表是与SearchTable中的最佳匹配项连接的ValData。同样,我已经有一个查询来完成这一部分。我只需要循环部分,而我的SQL技能几乎不存在。

Suedo代码为:

DECLARE @SearchID INT = 1
DECLARE @MaxSearchID INT = 15000
DECLARE @FName VARCHAR(50) = ''
DECLARE @FName VARCHAR(50) = ''
etc...
WHILE @SearchID <= @MaxSearchID
BEGIN
SET @FNAME = (SELECT [Fname] FROM ValData WHERE [RowID] = @SearchID)
SET @LNAME = (SELECT [Lname] FROM ValData WHERE [RowID] = @SearchID)
etc...
Do colleague's query, and then insert(?) search criteria joined with the result from the SearchTable in to a temporary result table.
END
SELECT * FROM FinalResultTable;

我最大的不足是如何创建一个临时结果表,即ValData的字段+SearchTable的字段,以及在循环迭代过程中,如何一次向这个临时结果表添加一行,其中包括与SearchTable的结果连接的ValData?

如果有帮助的话,我正在使用/希望连接ValData中的所有字段和SearchTable中的所有域。

使用这样的查询不是更容易吗。。?

SELECT FNAME,
LNAME
FROM ValData
WHERE (FName = @Fname
OR LName = @Lname)
AND RowID <= @MaxSearchID
ORDER BY RowID ASC;

实际上,除了破坏查询的性能之外,并没有任何理由使用WHILE

经过更多的尝试和错误,我能够回答我想要的内容(其核心是创建一个临时表,然后在其中插入行(。

CREATE TABLE #RESULTTABLE(
[feedname] VARCHAR(100),
...
[SCORE] INT,
[Max Score] INT,
[% Score] FLOAT(4),
[RowID] SMALLINT
)
SET @SearchID = 1
SET @MaxSearchID = (SELECT MAX([RowID]) FROM ValidationData
WHILE @SearchID <= @MaxSearchID
BEGIN
SET @FNAME = (SELECT [Fname] FROM ValidationData WHERE [RowID] = @SearchID)
...
--BEST MATCH QUERY HERE
--Select the "top" best match (order not guaranteed) in to the RESULTTABLE.
INSERT INTO #RESULTTABLE
SELECT TOP 1 *, @SearchID AS RowID
--INTO #RESULTTABLE 
FROM #TABLE3
WHERE [% Score] IN (SELECT MAX([% Score]) FROM #TABLE3)
--Drop temp tables that were created/used during best match query.
DROP TABLE #TABLE1
DROP TABLE #TABLE2
DROP TABLE #TABLE3
SET @SearchID = @SearchID + 1
END;
--Join the data that was validated (searched) to the results that were found.
SELECT *
FROM ValidationData vd
LEFT JOIN #RESULTTABLE rt ON rt.[RowID] = vd.[RowID]
ORDER BY vd.[RowID]
DROP TABLE #RESULTTABLE

我知道这可以通过执行联接来批准,可能将"BEST MATCH QUERY"作为内部查询。我只是还没那么熟练。这需要一个耗时数小时的手动过程,并将其缩短到一个小时左右

最新更新