[英]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.