0

我不明白为什么在运行以下代码时会出现以下错误:

27 WHERE (FC_ATTORNEY_ID, REC_CHNG_DT) IN _ 79 错误 79-322: 期望 (.

35 ) AND REC_CHNG_CD 在 ('A','C') 36 中;_ 79 错误 79-322:预期 a)。

proc sql;

create table test as
SELECT DISTINCT 
FC_ATTORNEY_ID, FC_ATTORNEY_NM, REC_CHNG_DT
FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
WHERE (FC_ATTORNEY_ID, REC_CHNG_DT) IN
(
SELECT
FC_ATTORNEY_ID
, MAX (REC_CHNG_DT) AS LST_DT
FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
WHERE  REC_CHNG_CD In ('A','C')
GROUP BY FC_ATTORNEY_ID
) AND REC_CHNG_CD In ('A','C')
;quit;

试图避免我描述的两个错误。我从另一个程序员那里收到了这段代码,但是他们使用的是 TOAD,而不是 SAS

4

3 回答 3

0

问题是这种语法:

(FC_ATTORNEY_ID, REC_CHNG_DT) IN ....

您不能以这种方式使用 IN 运算符。您只能将其与单个值一起使用,而不是某种类型的复合对象。

有效的语法就像你的其他用法:

REC_CHNG_CD IN ('A','C') 

或者

REC_CHNG_CD IN (select code_var from ....) 

如果您确实需要测试值的元组是否存在,请重新编码您的查询以使用 EXISTS。

但看起来您只是在询问 MAX 日期。

create table test as
  SELECT FC_ATTORNEY_ID, FC_ATTORNEY_NM, max(REC_CHNG_DT) as REC_CHNG_DT
  FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
  WHERE  REC_CHNG_CD In ('A','C')
  GROUP BY FC_ATTORNEY_ID, FC_ATTORNEY_NM
;
于 2019-04-18T18:59:04.237 回答
0

您正在为每位律师选择具有最新记录更改日期的行。

一种更简单的方法是在自动重新合并的组聚合上使用 HAVING 子句

proc sql;
  create table test as
  SELECT DISTINCT 
    FC_ATTORNEY_ID, FC_ATTORNEY_NM, REC_CHNG_DT
  FROM
    RDX_BDE.T_FORECLOSURE
  WHERE
    REC_CHNG_CD IN ('A','C')
  GROUP BY
    FC_ATTORNEY_ID
  HAVING 
    REC_CHNG_DT = MAX (REC_CHNG_DT)
  ;
于 2019-04-18T20:12:11.977 回答
0

您的and语句 中有T_FORCLOSURE两次。FROMWHERE

一个带有表标识符,一个没有。

去掉多余的代码来解决你的问题

于 2019-04-18T17:07:15.810 回答