sql - 在存储过程中重用 SELECT 查询的结果

标签 sql sql-server tsql stored-procedures

这可能是一个非常简单的问题,但我搜索答案的尝试被谷歌阻止,谷歌找到的答案展示了如何通过创建存储过程来重用查询。我想在存储过程中重用查询结果。

这是一个精简示例,其中我删除了 NOCOUNTXACT_ABORTTRANSACTIONTRY ,以及大部分逻辑。

CREATE PROCEDURE Do_Something
    @userId UNIQUEIDENTIFIER
AS
BEGIN

    DELETE FROM LikedItems
    WHERE likedItemId IN
    (
        SELECT Items.id FROM Items
        WHERE Items.userId = @userId
    )

    DELETE FROM FollowedItems
    WHERE followedItemId IN
    (
        SELECT Items.id FROM Items
        WHERE Items.userId = @userId
    )

END

重用重复嵌套SELECT结果而不是执行两次的语法是什么?

最佳答案

您可以将 SELECT 的结果 INSERT 到临时表或表变量中,但这并不自动意味着整体性能会更好。您需要测量它。

临时表

CREATE PROCEDURE Do_Something
    @userId UNIQUEIDENTIFIER
AS
BEGIN

    CREATE TABLE #Temp(id int);

    INSERT INTO #Temp(id)
    SELECT Items.id 
    FROM Items
    WHERE Items.userId = @userId;

    DELETE FROM LikedItems
    WHERE likedItemId IN
    (
        SELECT id FROM #Temp
    )

    DELETE FROM FollowedItems
    WHERE followedItemId IN
    (
        SELECT id FROM #Temp
    )

    DROP TABLE #Temp;

END

表变量

CREATE PROCEDURE Do_Something
    @userId UNIQUEIDENTIFIER
AS
BEGIN

    DECLARE @Temp TABLE(id int);

    INSERT INTO @Temp(id)
    SELECT Items.id 
    FROM Items
    WHERE Items.userId = @userId;

    DELETE FROM LikedItems
    WHERE likedItemId IN
    (
        SELECT id FROM @Temp
    )

    DELETE FROM FollowedItems
    WHERE followedItemId IN
    (
        SELECT id FROM @Temp
    )

END

关于sql - 在存储过程中重用 SELECT 查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377887/

相关文章:

mysql - SQL 中 IMPLICIT JOIN 的目的是什么?

SQL - 选择一个字段中具有来自另一字段的最高记录的不同记录

sql-server - 列出有关 SQL Server 中所有数据库文件的信息

sql - 从表中选择具有不同值的所有列

mysql - 如何在SQL中查询日期以获得上周的数据

MySQL 多个聚合函数和外连接

mysql - 如何合并两个sql select语句

SQL MAX 命令仍然返回多个结果

sql - 棘手的选择语句

sql - Average 函数在关系数据库中如何工作?