Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将IF存在移动到WHERE子句_Sql_Sql Server_Performance_Query Optimization - Fatal编程技术网

Sql 将IF存在移动到WHERE子句

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

在此示例查询中(针对设计不佳的供应商数据库):

既然WHERE子句的SELECTs和first部分是相同的,那么有没有一种方法可以安全地组合查询,同时确保首先检查FULLORDERNAME匹配项?我看到有。

你可以这样写:

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)