web-dev-qa-db-ja.com

SELECTの結果のリストを変数に格納してカウントし、結果を使用する

カーソルを使用するストアドプロシージャを使用して、重複するSELECTをフェッチするたびに、見つかったIDの数(SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var)と、COUNT(ID)が大きいかどうかを確認します次に、指定した値UPDATEが別のテーブルWHEREに発行されます。上記のIDが使用されます(_SELECT ID FROM TableA WHERE something.. @cur_var_)。

アイデアは、SELECTを変数に格納することです(疑似コードidlist= SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var)。次に、このlistの長さがIF(pseudo-code IFlength(idlist)_>100_。この場合、リストはWHEREステートメントで再び使用されます(疑似コードが再び、_UPDATE TableB SET value = @cur_var WHERE ID IN idlist_ )

十分に具体的にしたいのですが、SELECTの結果を変数に保存したいと思います。次に、_WHERE IN variable_の結果と、IFで使用する変数の行数を使用します。

Microsoft SQL Server Enterprise Edition v9.00.3042.00、つまりSQL Server 2005 Service Pack 2に取り組んでいます

[〜#〜]編集[〜#〜]

私は、個人情報を提供することなく、手順をできるだけ合理的にするよう努めました。

私の意図は、重複したコードを削除することです。 SELECTで使用されているIFと、SELECTWHEREで使用されているUPDATEは、最初に必要なことを除いて、同じです。 COUNT(ID)、次に実際のIDs

_DECLARE @cur_id int; 
SET @cur_id = 0;

DECLARE Cur CURSOR FOR
    --this is actually a more complex SELECT but basically gives a list of IDs
    SELECT ID FROM TableC ORDER BY ID DESC

    OPEN Cur;
    FETCH NEXT FROM Cur INTO @cur_id;

WHILE @@FETCH_STATUS = 0
BEGIN

    --here I check if the count of found IDs (with value=NULL and IN the SELECT) is bigger than 5
    IF
    (
        SELECT COUNT(ID) FROM TableA WHERE value=NULL AND ID IN
        (
            SELECT DISTINCT(ID) FROM TableB WHERE ID = @cur_id
        )
    ) > 5
    BEGIN
        --if its bigger, set the value for every ID that is part of the ID list (the same select, but above the count, below no count) 
        UPDATE TableB
        SET value = @cur_id
        WHERE ID IN
        (
            SELECT ID FROM TableA WHERE value=NULL AND ID IN
            (
                SELECT DISTINCT(ID) FROM TableB WHERE ID = @cur_id
            )
        )
    END

    FETCH NEXT FROM Cur INTO @cur_id;
END
_

編集2:

これは、上記のSELECTの重複に対する最も近い可能な解決策です。

_DECLARE @TempIDs TABLE
(
   ID int
);

INSERT INTO 
    @TempIDs 
--this is the select i have twice in the procedure above
SELECT 
    ID
FROM 
    TableA


SELECT COUNT(*) from @TempIDs
SELECT * FROM @TempIDs
_

この場合、SELECTは1回だけですが、後に2つのSELECTSが続き、1回は_*_を使用し、1回はCOUNT(*)を使用します。

このように_@TempIDs_を使用する方法はありませんか? (疑似コード):

_IF COUNT_ROWS(@TempIDs) > 5
BEGIN
    UPDATE TableB SET value = "wow" WHERE ID IN (@TempIDs)
END
_
3
Daedalus Mythos

クエリ結果をテーブル変数に入れて、簡単に実行できる行を反復処理する場合。もちろん、ループには注意してください。

DECLARE @Value int, @Label varchar(25)  
DECLARE @Tmp table (value int, label varchar(25)) 

INSERT INTO @Tmp (value, label) 
    SELECT 1, 'One' 
UNION SELECT 2, 'Two' 
UNION SELECT 3, 'Three' 

WHILE (SELECT count(1) FROM @Tmp) > 0 
BEGIN 
    SELECT TOP 1 @Value = value, @Label = label FROM @Tmp ORDER BY value 
    DELETE FROM @Tmp WHERE value = @Value 
    SELECT @Value 'value', @Label 'label' 
END 
4
DBNull