Sql 每年都有记录
我有两个名为Forms&Attachment的表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 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
);