繁体   English   中英

从存储过程中的表中排除特定行

[英]Exclude specific rows from table in Stored Procedure

我有一个名为Blacklist的表和一个名为Order的表。

两者都有CustomerId列。

存储过程ExecOrder操作Order表。

我的目标是排除具有黑名单 CustomerId 的订单(意思是:订单的 CustomerId 在黑名单表中)。

我像这样编辑了ExecOrder SP:

    DECLARE @Temp TABLE
    (
        CustomerId UNIQUEIDENTIFIER
    );
    INSERT INTO @Temp
        SELECT RightSide
        FROM Blacklist
        WHERE LeftSide = @CustomerId;

    BEGIN
            DECLARE db_cursor CURSOR
            FOR SELECT OrderId
                FROM dbo.[Order] ord
                LEFT OUTER JOIN @Temp t ON t.CustomerId <> ord.CustomerId AND ord.CustomerId <> @CustomerId
                WHERE AssetId = @BaseAsset
                      AND CurrencyId = @QuoteAsset
                      AND OrderTypeId <> @OrderType
                      AND [QuotePrice] <= @QuotePrice
                      AND OrderStatusId = 10
                      AND Amount > ISNULL(AmountFilled, 0)
                      AND OrderId < @OrderId
                      AND OrderBookId = @OrderBookId
                      AND DeliveryStart = @DeliveryPeriodStart
                      AND DeliveryEnd = @DeliveryPeriodEnd
                      AND @MinAmount <= Amount - ISNULL(AmountFilled, 0) 
                ORDER BY OrderDate;

    END;

@Temp 表返回正确的 CustomerId 列表。 问题是不排除列入黑名单的订单。

您的 @Temp 表包含列入黑名单的客户。

-- contains blacklisted customer
INSERT INTO @Temp
        SELECT RightSide
        FROM Blacklist
        WHERE LeftSide = @CustomerId;

现在,您需要在 @Temp 表中不存在的客户的 select 订单。

-- You need to select orders, where customerId not exists in @Temp table
SELECT OrderId
                FROM dbo.[Order] ord
WHERE NOT EXISTS(SELECT 1 from @Temp WHERE customerId = ord.CustomerId) ...

您应该连接黑名单并仅在不存在连接的黑名单的情况下使用:

LEFT OUTER JOIN @Temp t ON t.CustomerId <> ord.CustomerId AND ord.CustomerId <> @CustomerId

改成:

LEFT OUTER JOIN @Temp t ON t.CustomerId = ord.CustomerId OR ord.CustomerId = @CustomerId

接下来,您应该检查它是否为空:

WHERE ... AND t.CustomerId IS NULL

暂无
暂无

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

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