Sql 每年都有记录

Sql 每年都有记录,sql,plsql,oracle10g,Sql,Plsql,Oracle10g,我有两个名为Forms&Attachment的表 Forms Table User_Id (PK) | User_name | Submitted_date Attachment table User_id (FK) | Attachment_name | Submitted_date. 表单可以有多个附件 我想写一个查询,它将获取自表单提交以来每年没有附件的表单记录。 自提交之日起,每年必须附有表格附件。我希望找到不属于这种情况的记录。尝试以下操作: SELECT

我有两个名为Forms&Attachment的表

Forms Table
User_Id (PK)  | User_name          | Submitted_date

Attachment table
User_id (FK)  | Attachment_name   | Submitted_date.
表单可以有多个附件

我想写一个查询,它将获取自表单提交以来每年没有附件的表单记录。 自提交之日起,每年必须附有表格附件。我希望找到不属于这种情况的记录。

尝试以下操作:

SELECT
    f.*
FROM
    Forms f
    left join Attachement a 
        on f.User_id = a.User_id
        and TO_CHAR(f.Submitted_date,'YYYY') = TO_CHAR(a.Submitted_date,'YYYY')
WHERE
    a.Attachement_name IS NULL

这将尝试使用
表单加入
attachement
,因此如果没有attachement,它将返回
NULL
,然后我们只检索
NULL
加入的附件。

我能想到的唯一方法是在运行查询之前用PLSQL填充ETL样式表:

create table form_years (user_id number(19), year varchar2(4));

DECLARE
BEGIN
  execute immediate 'TRUNCATE TABLE form_years';
  FOR cur_form IN
  ( SELECT User_Id, TO_CHAR(submitted_date, 'yyyy') AS YEAR FROM Forms
  )
  LOOP
    INSERT INTO form_years
    SELECT cur_form.User_Id,
      TO_CHAR(add_months(to_date('01-01-'
      || cur_form.year,'mm-dd-yyyy'), (rownum -1)*12), 'yyyy')
    FROM all_objects
    WHERE rownum <= (months_between(to_date('01-01-'
      || TO_CHAR(add_months(sysdate, 12), 'yyyy'),'dd-mm-yyyy'),to_date('01-01-'
      || cur_form.year,'mm-dd-yyyy')))/12;
    COMMIT;
  END LOOP;
END;
/

你试过什么了吗?如果是,就把它贴出来
SELECT user_id
FROM Forms f
WHERE EXISTS
  (SELECT 0
  FROM form_years
  LEFT OUTER JOIN Attachment
  ON Attachment.user_id     = form_years.user_id
  AND form_years.year       = TO_CHAR(Attachment.Submitted_date, 'yyyy')
  WHERE Attachment.user_id IS NULL
  AND f.user_id             = form_years.user_id
  );