我有两张名为Forms& amp;附件。
Forms Table
User_Id (PK) | User_name | Submitted_date
Attachment table
User_id (FK) | Attachment_name | Submitted_date.
表格可以有多个附件。
我希望写入查询,这将提取自提交表单以来每年没有附件的表单记录。 自提交以来,必须每年附上表格。我想查找不属于这种情况的记录。
答案 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
);