简体   繁体   English

如何基于子查询中的EXISTS更新临时表中的1列?

[英]How to update 1 column in a temp table based on an EXISTS in a sub-query?

How to update 1 column in a temp table based on an EXISTS in a sub-query? 如何基于子查询中的EXISTS更新临时表中的1列?

I am using SQL Server 2008 R2 and there are about 3000 rows.. so I need it to be fast 我正在使用SQL Server 2008 R2,大约有3000行..所以我需要它要快

This works.. but I don't know where to go from here.. 这有效..但是我不知道从这里去哪里。

SELECT ROW_NUMBER() OVER(ORDER BY RowID) AS RowNumber 
FROM #tempTable

How would I update 1 column in this #tempTable based on another subquery that is actually also 2 joined tables? 我如何基于实际上也是2个联接表的另一个子查询来更新#tempTable的1列?

Does what I have shown here with ROW_NUMBER belong in the WHERE clause? 我在这里用ROW_NUMBER显示的内容是否属于WHERE子句?

I am trying to eliminate a WHILE loop in an existing stored procedure and I have never worked with ROW_NUMBER 我试图消除现有存储过程中的WHILE循环,但从未使用过ROW_NUMBER

Existing Procedure: 现有程序:

   DECLARE @StopRow AS INT

    SELECT @StopRow = MAX(RowID)
    FROM #Temp1

    DECLARE @RowCounter AS INT

    SET @RowCounter = 1

    DECLARE @colID INT

    WHILE (@RowCounter <= @StopRow)
    BEGIN
        SELECT @colID = colID
        FROM #Temp1
        WHERE colRowID = @RowCounter

        IF (
                EXISTS (
                    SELECT ParentColID
                    FROM ParentTable a WITH (NOLOCK)
                    JOIN MoreTableData b WITH (NOLOCK) ON a.priID = b.priID
                        AND colID = @colID
                    WHERE anotherID NOT IN (
                            SELECT anotherID
                            FROM @anotherTempTable
                            )
                    )
                )
            UPDATE #Temp1
            SET aFlag = 0
            WHERE colRowID = @RowCounter

        SET @RowCounter = @RowCounter + 1
    END

It may be helpful: UPDATE from SELECT using SQL Server 可能会有所帮助: 使用SQL Server从SELECT更新

So, you can use custom expressions for bulk UPDATE of the records 因此,您可以使用自定义表达式来批量更新记录

It seems that your query in correct but may be there is some formatting issue. 您的查询似乎正确,但可能存在一些格式问题。

Try this changed query. 试试这个改变的查询。

DECLARE @StopRow AS INT

SELECT @StopRow = MAX(RowID)
FROM #Temp1

DECLARE @RowCounter AS INT

SET @RowCounter = 1

DECLARE @colID INT

WHILE (@RowCounter <= @StopRow)
BEGIN
    SELECT @colID = colID
    FROM #Temp1
    WHERE colRowID = @RowCounter

    IF  EXISTS (
                SELECT ParentColID
                FROM ParentTable a WITH (NOLOCK)
                JOIN MoreTableData b WITH (NOLOCK) ON a.priID = b.priID
                    AND colID = @colID
                WHERE anotherID NOT IN (
                        SELECT anotherID
                        FROM @anotherTempTable
                        )
            )

   BEGIN
        UPDATE #Temp1
        SET aFlag = 0
        WHERE colRowID = @RowCounter
   END

    SET @RowCounter = @RowCounter + 1
END

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM