0

関数から生成された 2 つの一時テーブルを別のテーブルと比較する SP があります。私の問題は、各一時テーブルをステップ実行する代わりに、同時に両方を通過することです。目的の結果を得るために、一度に 1 つずつ各テーブルをステップ実行するコードの書き方がわかりません。

    DROP PROCEDURE uspJudgments;
GO
CREATE PROCEDURE uspJudgments 
@fullName varchar(100), @fullName1 varchar(100)
AS
BEGIN

SELECT *
INTO #tmpFullname
FROM dbo.DelimitedSplit8K(@fullName, ',')

SELECT *
INTO #tmpFullname1
FROM dbo.DelimitedSplit8K(@fullName1, ',')

SELECT *
FROM #tmpFullName

SELECT *
FROM #tmpFullName1

DECLARE @MaxRownum int
SET @MaxRownum = (SELECT MAX(ItemNumber) FROM #tmpFullname)

DECLARE @Iter int
SET @Iter = (SELECT MIN(ItemNumber) FROM #tmpFullname)

DECLARE @MaxRownum1 int
SET @MaxRownum1 = (SELECT MAX(ItemNumber) FROM #tmpFullname1)

DECLARE @Iter1 int
SET @Iter1 = (SELECT MIN(ItemNumber) FROM #tmpFullname1)

DECLARE @Name varchar(25)
DECLARE @Name1 varchar(25)


WHILE @Iter <= @MaxRownum AND @iter1 <= @Maxrownum1

BEGIN

    SET @Name = (SELECT Item FROM #tmpFullname WHERE ItemNumber = @Iter)   
    SET @Name1 = (SELECT Item FROM #tmpFullname1 WHERE ItemNumber = @Iter1)   
    SELECT *
    --INTO #tmpDefSelect
    FROM defendants_ALL 
    WHERE combined_name LIKE '%' + @Name + '%' AND combined_name LIKE '%' + @Name1 + '%';

    SET @Iter = @Iter + 1
    SET @Iter1 = @Iter1 + 1
END

END


DROP TABLE #tmpFullname
DROP TABLE #tmpFullname1

EXEC uspJudgments @fullName = 'grein,smit', @fullName1 = 'joh,jon,j.'

grein のすべての結果を取得する必要があります -- joh、jon、j。そして、smit、joh、jon、j。

現在、上記のコードは grein joh AND smit, jon. のみを返します。データベースでは、最初の組み合わせの結果は返されず、jonathon smith と jon smith の 38 件の結果が返されます。各一時テーブルを適切に処理して、目的の結果を得るにはどうすればよいですか?

4

1 に答える 1

1

grein johとをsmith jon反復処理する方法のために、2つの組み合わせしか取得できません。両方を同時にインクリメントします。次のようなネストされたループが必要です。@Iter@iter1

declare @start_val integer = @iter1

while @Iter <= MaxRownum
begin

  set @iter1 = @start_val

  while @iter1 <= @Maxrownum1
  begin

    set @Name = ...
    set @Name1 = ...

    ...

    set @iter1 = @iter1 + 1
  end

  set @Iter = @Iter + 1
end

WHILEしかし、私はあなたがループさえ必要とは思わない:

select d.*
from   defendants_ALL, #tmpFullname t1, #tmpFullname1 t2
where  d.combined_name = t1.Item + ' ' + t2.Item

または(まだ使用する必要がある場合LIKE):

select d.*
from   defendants_ALL, #tmpFullname t1, #tmpFullname1 t2
where  d.combined_name like '%' + t1.Item + '%'
  and  d.combined_name like '%' + t2.Item + '%'

(すべてのSQLはテストされていません...)

于 2012-10-20T02:33:41.473 に答える