也许有人可以协助设计查询来满足这些要求。我需要将其作为内联视图的一部分,该视图将加入到更大的查询中。
我有电子邮件地址的基本表格:
EMAIL
jon@a.com
art@b.com
然后我有一个表,名为UPLOAD_HISTORY。样本数据:
EMAIL FILETYPE FILENAME
jon@a.com 1 file1.txt
jon@a.com 2 filex.txt
jon@a.com 4 fileb.txt
然后是文件类型表:
FILE ID FILE TYPE
1 TYPE A
2 TYPE B
3 TYPE C
4 TYPE D
如果我执行查询,并且外部加入UPLOAD_HISTORY和FILE_TYPES,我将得到类似这样的信息:
EMAIL FILETYPE FILENAME
jon@a.com 1 file1.txt
jon@a.com 2 filex.txt
3
jon@a.com 4 fileb.txt
对于丢失的记录,我需要填写UPLOAD_HISTORY表中的丢失值。我理想的结果集如下所示:
EMAIL FILETYPE FILENAME STATUS
jon@a.com 1 file1.txt 1
jon@a.com 2 filex.txt 1
jon@a.com 3 0
jon@a.com 4 fileb.txt 1
我希望获取所有文件类型,每行一封电子邮件,如果该文件类型有记录,则状态为1,否则为0 ........
有时可能会通过一些标准。我可能会要求提供一种特定的文件类型。
如果特定电子邮件在UPLOAD_HISTORY表中没有任何条目,是否有可能获得空记录?
EMAIL FILETYPE FILENAME STATUS
jon@a.com 1 file1.txt 1
jon@a.com 2 filex.txt 1
jon@a.com 3 0
jon@a.com 4 fileb.txt 1
art@b.com 1 0
art@b.com 2 0
art@b.com 3 0
art@b.com 4 0
但是,我只要求文件类型1:
EMAIL FILETYPE FILENAME STATUS
jon@a.com 1 file1.txt 1
art@b.com 1 0
谢谢
答案 0 :(得分:0)
从文件类型到历史记录的左联接:
select EMAIL, FILETYPE, FILENAME, nvl(STATUS, 0) as STATUS
from file_type
left join upload_history on FILETYPE = FILE_ID
答案 1 :(得分:0)
在email
和file_type
上使用CROSS JOIN获取所有组合,然后在upload_history
上使用LEFT OUTER JOIN获得所需的结果。
假设每种组合中upload_history
中最多有一个记录,那么应该很好:
select eft.email
, eft.filetype
, uh.filename
, nvl2(uh.filename, 1, 0) as status
from ( select email, file_id, filetype
from email
cross join file_type ) eft
left outer join upload_history uh
on uh.email = eft.email
and uh.filetype = eft.filetype
order by eft.email
, eft.filetype
如果upload_history
中每个组合都有多个记录,则您没有指定要发生的事情。也许每filename
一行是正确的。但是status
列的用途似乎有点多余。