Sql 将IF存在移动到WHERE子句
在此示例查询中(针对设计不佳的供应商数据库): 既然WHERE子句的SELECTs和first部分是相同的,那么有没有一种方法可以安全地组合查询,同时确保首先检查FULLORDERNAME匹配项?我看到有。你可以这样写:Sql 将IF存在移动到WHERE子句,sql,sql-server,performance,query-optimization,Sql,Sql Server,Performance,Query Optimization,在此示例查询中(针对设计不佳的供应商数据库): 既然WHERE子句的SELECTs和first部分是相同的,那么有没有一种方法可以安全地组合查询,同时确保首先检查FULLORDERNAME匹配项?我看到有。你可以这样写: SELECT Stuff FROM Foo WHERE X = 'Y' AND (FullOrderNumber = @FullOrderNo OR (NOT EXISTS (SELECT 1 FROM Foo WHERE Full
SELECT Stuff
FROM Foo
WHERE X = 'Y' AND
(FullOrderNumber = @FullOrderNo OR
(NOT EXISTS (SELECT 1 FROM Foo WHERE FullOrderNumber = @FullOrderNo) and OrderNumber = @OrderNo) )
如果只查找一行,可以使用order by
进行优先级排序:
SELECT TOP (1) Stuff
FROM Foo
WHERE X = 'Y' AND
(FullOrderNumber = @FullOrderNo OR OrderNumber = @OrderNo)
ORDER BY (CASE WHEN FullOrderNumber = @FullOrderNo THEN 1 ELSE 2 END)
实际上,即使存在重复项,您也可以将与领带一起使用,如下所示:
SELECT TOP (1) WITH TIES Stuff
FROM Foo
WHERE X = 'Y' AND
(FullOrderNumber = @FullOrderNo OR OrderNumber = @OrderNo)
ORDER BY (CASE WHEN FullOrderNumber = @FullOrderNo THEN 1 ELSE 2 END)
WHERE FullOrderNumber=@FullOrderNo或OrderNumber=@OrderNo
@M.Ali:当存在FullOrderNumber=@FullOrderNo
@M.Ali的记录时,我只想在表中任何位置的FullOrderNumber都不匹配的情况下,返回OrderNumber=@OrderNo
不需要的记录。这些示例可能将两个语句重新编写为一个语句;但是他们不保证:首先检查FullOrderNumber匹配。如果FULLORDERNAME上有索引,但ORDERNAME上没有索引,则它可能会执行完整表扫描(这可能是OP试图通过此要求避免的)。@Gerrat。我将其解释为“首先返回完整的订单号”。然而,我不太清楚OP的意思。@GordonLinoff-谢谢;为了澄清,我宁愿避免表扫描。如果原作表现更好,我会坚持下去。@TrueWill<代码>或
通常会导致表格扫描。但是,数据的大小和第一个筛选器的选择性对性能有很大影响。在答案中的第一个SELECT中,我认为您希望在表达式的或部分周围加上括号。否则,它可以返回X'Y'
中的匹配项。
SELECT TOP (1) WITH TIES Stuff
FROM Foo
WHERE X = 'Y' AND
(FullOrderNumber = @FullOrderNo OR OrderNumber = @OrderNo)
ORDER BY (CASE WHEN FullOrderNumber = @FullOrderNo THEN 1 ELSE 2 END)