Sql 执行同一查询两次,但使用一个不同的WHERE子句
请原谅,我的问题很简单,我在放屁: 以下是我的表模式:Sql 执行同一查询两次,但使用一个不同的WHERE子句,sql,sql-server,Sql,Sql Server,请原谅,我的问题很简单,我在放屁: 以下是我的表模式: Foo( FooId, BarDate dateTime, Baz int ) 鉴于这个疑问 SELECT MAX( Foo.BarData ) FROM Foo WHERE Foo.Baz = 2 AND Foo.BarData < @dateParameter 可以在同一个查询中获得Foo.Baz和Foo.Baz的最大值,使用CASE分隔原始数据 SELECT COALESCE(MAX(
Foo( FooId, BarDate dateTime, Baz int )
鉴于这个疑问
SELECT
MAX( Foo.BarData )
FROM
Foo
WHERE
Foo.Baz = 2
AND
Foo.BarData < @dateParameter
可以在同一个查询中获得Foo.Baz和Foo.Baz的最大值,使用CASE分隔原始数据
SELECT COALESCE(MAX(CASE WHEN Foo.Baz = 2 THEN Foo.BarDate ELSE NULL END)
, MAX(CASE WHEN Foo.Baz = 0 THEN Foo.BarDate ELSE NULL END)
)
FROM Foo
WHERE Foo.Baz IN (0,2)
AND Foo.BarDate < @dateParameter
只需选择两行并将结果限制为1行,这样首选行就排在第一位
SELECT TOP 1
MAX( Foo.BarData )
FROM
Foo
WHERE
((Foo.Baz = 2) OR
(Foo.Baz = 0))
AND
Foo.BarData < @dateParameter
GROUP BY Foo.Baz
ORDER BY Foo.Baz DESC
为了完成列表,您可以使用IF..ELSE,如下所示
IF EXISTS (SELECT 1 FROM Foo WHERE Foo.Baz = 2)
BEGIN
SELECT MAX( Foo.BarData)
FROM Foo
WHERE Foo.Baz = 2
AND Foo.BarData < @dateParameter
END
ELSE
BEGIN
SELECT MAX( Foo.BarData)
FROM Foo
WHERE Foo.Baz = 0
AND Foo.BarData < @dateParameter
END
以防对你有帮助
SELECT COALESCE(
(SELECT MAX(Foo.BarData) FROM Foo WHERE Foo.Baz = 2 AND Foo.BarData < @dateParameter),
(SELECT MAX(Foo.BarData) FROM Foo WHERE Foo.Baz = 0 AND Foo.BarData < @dateParameter)
)
根据您的平台,这可能比其他答案有更好的计划。在SQL Server上,不需要FROM子句。在Oracle上,您可以从双通道中进行选择。其他系统可能需要返回单行的伪表达式
OP的查询可能只是使用交叉连接而不是外部连接编写的。这可能是它感觉像黑客的部分原因。我想说的是,你的需求并不是一个普通的sql式问题,所以任何答案都是这样的
如果您想强调典型的路径是Foo.Baz=2的情况,您可能会喜欢它的外观:
SELECT COALESCE(
MAX(Foo.BarData),
(SELECT MAX(Foo.BarData) FROM Foo WHERE Foo.Baz = 0 AND Foo.BarData < @dateParameter)
)
FROM Foo
WHERE Foo.Baz = 2 AND Foo.BarData < @dateParameter)
你所说的最大值是什么意思,也许你错过了分组,订单号为否,它将返回1,你没有考虑分组
SELECT COALESCE(
MAX(Foo.BarData),
(SELECT MAX(Foo.BarData) FROM Foo WHERE Foo.Baz = 0 AND Foo.BarData < @dateParameter)
)
FROM Foo
WHERE Foo.Baz = 2 AND Foo.BarData < @dateParameter)