我有一个存储过程,其目的是查询表中与声明的LocID
不匹配的行。但是,我现在要做的是根据以下行过滤掉我的数据的最佳方法:
LocID
ZipCode
值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的行将在第二个下拉列表中返回。
执行此操作的最佳方法是什么?这是我需要通过存储过程中的子查询做的事情吗?我觉得我在想这个。
答案 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
);
答案 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上加入自身时查找错过的连接,并且应该明显优于非连接方法。