内联视图问题

时间:2018-07-21 23:51:42

标签: oracle inline-view

也许有人可以协助设计查询来满足这些要求。我需要将其作为内联视图的一部分,该视图将加入到更大的查询中。

我有电子邮件地址的基本表格:

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

谢谢

2 个答案:

答案 0 :(得分:0)

从文件类型到历史记录的左联接:

select EMAIL, FILETYPE, FILENAME, nvl(STATUS, 0) as STATUS
from file_type
left join upload_history on FILETYPE = FILE_ID

答案 1 :(得分:0)

emailfile_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列的用途似乎有点多余。