Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 执行同一查询两次,但使用一个不同的WHERE子句_Sql_Sql Server - Fatal编程技术网

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)