我正在执行2个不同的SQL查询,对我来说,它们应该产生相同的结果,但事实并非如此。排序顺序在第二个查询中更改。只是想知道它为什么会发生?
SELECT * FROM CTE ORDER BY ServiceDate ,ServiceTime ,CASE WHEN SortProfile = 'Y' THEN SortOrder1 ELSE SortOrder2 END ,CASE WHEN SortProfile = 'N' THEN SortOrder2 ELSE SortOrder1 END ,Price DESC ------------------------------------------------------------------------------------ Code Date Time Price SortProfile SortOrder2 SortOrder1 ------------------------------------------------------------------------------------ 38424 02/10/2015 13:12:00 0 N 14 9 38440 02/10/2015 13:12:00 0 N 14 9 41892 02/10/2015 13:12:00 0 N 25 13 38436 02/10/2015 13:12:00 0 N 25 11 18228 02/10/2015 13:12:00 0 N 25 15 SELECT * FROM CTE ORDER BY ServiceDate ,ServiceTime ,SortOrder2 ,Price DESC ------------------------------------------------------------------------------------ Code Date Time Price SortProfile SortOrder2 SortOrder1 ------------------------------------------------------------------------------------ 38424 02/10/2015 13:12:00 0 N 14 9 38440 02/10/2015 13:12:00 0 N 14 9 18228 02/10/2015 13:12:00 0 N 25 15 38436 02/10/2015 13:12:00 0 N 25 11 41892 02/10/2015 13:12:00 0 N 25 13
答案 0 :(得分:0)
试试这个:
select * from CTE
order by SortProfile ,
case when SortProfile = 'Y' then SortOrderOne
else case when SortProfile = 'N' then SortOrdertwo
end
end DESC,
case when SortProfile = 'Y' then SortOrdertwo
else case when SortProfile = 'N' then SortOrderOne
end
end DESC
输出是:
SortOrderOne SortOrderTwo SortProfile
14 9 N
14 9 N
25 15 Y
25 13 Y
25 11 Y
答案 1 :(得分:0)
在第一个排序中,您不需要按照以下两个顺序
WHEN SortProfile = 'Y'
THEN SortOrder1
ELSE SortOrder2
END
,CASE
WHEN SortProfile = 'N'
THEN SortOrder2
ELSE SortOrder1
END
使用其中任何一个因为它们产生相同的结果。
此外,似乎按顺序按顺序正确排序列,因为您的订单中的所有列都已正确排序。只需按条件顺序添加列[code]即可获得相同的结果。我认为这可能会解决问题
答案 2 :(得分:0)
To me they should produce the same results, but its not
两个结果都是正确的,因为最后3行在排序列中具有相同的值,因此这3行中的任何顺序都是可接受的。
对于这两个查询,您看到的差异由不同 execution plans
解释(它们不同,因为其中一个查询包含SortOrder1
中的order by
和其他execution plan
不是)。
当服务器详细说明SortOrder1
时,它不知道您的查询是否会返回" Y"因此它会考虑use std::mem::discriminant;
#[derive(PartialEq, Eq)]
enum Foo {
A,
B(usize),
}
fn main() {
let to_test = Foo::B(123);
let some_bool = true;
if discriminant(&to_test) == discriminant(&Foo::B(0)) && some_bool {
println!("Do stuff");
}
}
并将其用于第一个计划的排序,而不会在第二个计划中使用它。
你可以向自己证明这两个执行计划。