当我尝试运行下面的代码时,出现以下错误, “在需要条件的上下文中,在','附近指定了非布尔类型的表达式。” 我不理解为什么当我仅运行类似的查询时,此查询为什么返回错误不使用日期。任何帮助将不胜感激,谢谢!
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])
答案 0 :(得分: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_NUMBER
替换为RANK
。
答案 1 :(得分: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
);
答案 2 :(得分: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