AND语句中的SQL子查询

时间:2014-05-15 20:50:02

标签: sql subquery

一些问题。

  1. 已解决 valid_from_tsp <> max(valid_from_tsp) - 如何根据不是最大日期来过滤我的查询?这个想法不起作用返回的错误是:“在WHERE子句中不正确地使用聚合函数”

  2. 我的第二个问题是当我在没有日期的情况下运行它时,我返回了语法错误:Syntax error, expected something like 'IN' keyword or 'CONTAINS' keyword between ')' and ')'

  3. 你怎么看我没有?提前致谢

    修改了查询

    select 
       a.*, 
       b.coverage_typ_cde as stg_ctc 
    from P_FAR_BI_VW.V_CLAIM_SERVICE_TYP_DIM a
       inner join (select distinct etl_partition_id, coverage_typ_cde from 
         P_FAR_STG_VW.V_CLAIM_60_POLICY_STG where row_Create_tsp > '2013-11-30 23:23:59')b 
       on (a.etl_partition_id = b.etl_partition_id)
    where a.valid_from_tsp > '2013-11-30 23:23:59' 
    and a.coverage_typ_cde = ' '
    and (select * from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM where service_type_id = 136548255 
       and CAST(valid_from_tsp AS DATE) <> '2014-03-14')
    

    麻烦部分:and (select * from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM where service_type_id = 136548255 and CAST(valid_from_tsp AS DATE) <> '2014-03-14')

    我正在尝试按service_type_id上​​的日期过滤,我收到问题2中的错误

    至于样本数据:这有点棘手,此查询返回数千行数据。目前,当我进行内连接时,我得到一个辅助唯一索引违规错误。所以我试图过滤掉所有内容,但最近的可能是违规行为(service_type_id是次要索引)

    如果我使用service_type_id带回三行不同的valid_from_tsp时间戳,我只想保留最新的一行,而在查询中,不返回其他两行。

2 个答案:

答案 0 :(得分:2)

我不知道您的第二个问题,但您的第一个错误是由于在where子句中使用聚合函数max。我不确定你想在这里做什么,但快速解决方法是用仅返回最大值的子查询替换max(valid_from_tsp)

答案 1 :(得分:1)

这是您的查询:

select a.*,  b.coverage_typ_cde as stg_ctc 
from P_FAR_BI_VW.V_CLAIM_SERVICE_TYP_DIM a inner join
     (select distinct etl_partition_id, coverage_typ_cde
      from P_FAR_STG_VW.V_CLAIM_60_POLICY_STG
      where row_Create_tsp > '2013-11-30 23:23:59'
     ) b 
     on (a.etl_partition_id = b.etl_partition_id)
where a.valid_from_tsp > '2013-11-30 23:23:59' and
      a.coverage_typ_cde = ' ' and
      (select *
       from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM
       where service_type_id = 136548255 and
             CAST(valid_from_tsp AS DATE) <> '2014-03-14'
      );

一般情况下,where子句中没有条件的子查询。某些数据库可能允许此上下文中的标量子查询(一个返回一行和一列),但这不是标量子查询。您可以使用exists

修复语法
where a.valid_from_tsp > '2013-11-30 23:23:59' and
      a.coverage_typ_cde = ' ' and
      exists (select 1
              from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM
              where service_type_id = 136548255 and
                    CAST(valid_from_tsp AS DATE) <> '2014-03-14'
             );