对存储过程或建议执行查询查询以获得最佳实践

时间:2014-09-06 20:08:22

标签: sql sql-server tsql stored-procedures

我有一个存储过程,其目的是查询表中与声明的LocID不匹配的行。但是,我现在要做的是根据以下行过滤掉我的数据的最佳方法:

  1. LocID
  2. 不匹配
  3. 与声明的ZipCode
  4. 中的LocID不匹配

    代码:

    DECLARE @LocID
    
    SELECT ZipCode
                ,[Description] = ZipCode + ' - ' + Description
    FROM LocMap
    WHERE LocID <> @LocID
    

    以下是名为LocMap的表的快速布局。

    LocID | ZipCode | Description
    ----------------------------------
     100  | 91012   | Magical Sky
     100  | 91013   | Dream Land
     101  | 91012   | Blue Ocean
     102  | 91012   | Gray Screen
     104  | 91014   | Limit Break
     108  | 91016   | Magic Hammer
    

    结果以JSON格式返回,以便根据用户从第一个下拉字段中选择的LocID填充到表单上的第二个下拉字段。因此,例如,如果用户从第一个下拉列表中选择LocID = 100,则存储过程将执行查询,并仅返回ZipCodes中不存在的LocID = 100。在这种情况下,ZipCodes 91014和91016的行将在第二个下拉列表中返回。

    执行此操作的最佳方法是什么?这是我需要通过存储过程中的子查询做的事情吗?我觉得我在想这个。

3 个答案:

答案 0 :(得分:2)

有几种不同的方法可以做到这一点(存储你在查询变量,CTE,子查询,LEFT OUTER JOIN中查询的LocID的ZipCode等),但在这种情况下,你真的应该只需要检查第二个条件(zip&lt;&gt; LocID zip),因为这将考虑LocID查找(您正在检查的ID的zip将删除该条目)。

在那之后,你应该对子查询很好:

DECLARE @LocID INT;

SELECT
    l.[ZipCode],
    [Description] = l.ZipCode + ' - ' + l.Description
FROM LocMap l
WHERE l.ZipCode NOT IN (
    SELECT l2.ZipCode
    FROM LocMap l2
    WHERE l2.LocID = @LocID
);

当然,运行SET STATISTICS IO ON /检查实际执行计划以确保它运行良好。您也可以在这里进入CTE /加入路线,但它可能会产生相同的查询计划,所以我将从这里开始。这实际上取决于which is a better fit的情况。

答案 1 :(得分:0)

您可以使用相关的子查询执行此操作。请注意,您不必明确排除@LocID,因为它也会被第二个标准排除。

select
    ZipCode,
    [Description] = ZipCode + ' - ' + Description
from
    LocMap l1
where
    Not Exists (
        select
            'x'
        from
            LocMap l2
        where
            l2.LocID = @LocID and
            l2.ZipCode = l1.ZipCode
    );

Example SQLFiddle

答案 2 :(得分:0)

关于&#34;过度思考&#34;,您不需要存储过程 - 您只需要一个查询。恕我直言,stored procedures are to be avoided wherever possible

此查询将执行此操作:

select
  a.ZipCode,
  a.ZipCode + '-' + a.Description as Description
from LocMap a
left join LocMap b on b.locid = 100
  and a.ZipCode = b.ZipCode
where a.locid != 100
and b.ZipCode is null

这可以通过在匹配的ZipCode上加入自身时查找错过的连接,并且应该明显优于非连接方法。