获取每年的记录

时间:2014-04-16 04:53:52

标签: sql plsql oracle10g

我有两张名为Forms& amp;附件。

Forms Table
User_Id (PK)  | User_name          | Submitted_date

Attachment table
User_id (FK)  | Attachment_name   | Submitted_date.

表格可以有多个附件。

我希望写入查询,这将提取自提交表单以来每年没有附件的表单记录。 自提交以来,必须每年附上表格。我想查找不属于这种情况的记录。

2 个答案:

答案 0 :(得分:0)

试试这个:

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加入forms,所以如果没有附件,则返回NULL,然后我们仅检索< / strong> NULL加入了附件。

答案 1 :(得分:0)

我能想到的唯一方法是在运行查询之前使用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
  );