0

当我尝试运行下面的代码时,我收到以下错误, “在预期条件的上下文中指定的非布尔类型的表达式,靠近','。” 我不明白为什么当我只运行类似查询而不使用日期时此查询返回错误。任何帮助将不胜感激,谢谢!

SELECT *
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV
WHERE (CLASS_DEV.State, Eff_Date) = (SELECT State, Max(Eff_Date) FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION])
4

3 回答 3

1

我不认为 SQL Server 支持IN具有多列的子句(尽管 MySQL 支持)。但我们可以在TOP这里使用:

SELECT TOP 1 *
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION]
ORDER BY Eff_Date DESC;

实际上,我认为您的查询的字面翻译会使用TOP 1 WITH TIES,所以如果您希望所有记录都可能与最大生效日期相关联,您可以尝试这个而不是我上面写的内容。

如果您想查找具有最近生效日期的每个州的记录,那么我们可以使用ROW_NUMBER

SELECT *
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY State ORDER BY Eff_Date DESC) rn
    FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] 
) t
WHERE rn = 1;

同样,如果您想要可以替换ROW_NUMBERRANK.

于 2018-07-18T01:09:28.007 回答
0

实际上,如果没有样本输入/输出数据,向您发送最佳和正确的查询会有点困难。

但正如错误消息和您给定的查询中所示,很明显您不能在Where子句中具有元组结构......

您需要使用前面提到的方法之一或以下方式重写查询:

SELECT CLASS_DEV1.*
FROM [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV1
    INNER JOIN [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] AS CLASS_DEV2
        ON CLASS_DEV1.State = CLASS_DEV2.State
GROUP BY CLASS_DEV1.State,
         CLASS_DEV1.Eff_Date
HAVING MAX(CLASS_DEV2.Eff_Date) = CLASS_DEV1.Eff_Date
于 2018-07-18T07:27:36.327 回答
0

SQL Server 不支持带有in. 没有子查询的另一种选择是:

select top (1) with ties w.*
from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w
order by rank() over (partition by state order by eff_date desc);

另一种方法使用相关子查询:

select w.*
from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w
where w.eff_date = (select max(w2.eff_date)
                    from [Rating_Sandbox_Dev].[dbo].[TBL_WC_DEVIATION] w2
                    where w2.state = w.state
                   );
于 2018-07-18T01:39:54.160 回答