【问题标题】:Inline View Qustion内联视图问题
【发布时间】:2018-07-21 23:51:41
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 一次问一个问题。请确认您真正想查看哪个输出并将这个问题限制在那个输出。
  • 请不要在发布代码时使用 HTML 标签。代码的降价更简单,与 StackOverflow 渲染器配合得很好,更容易修复。要格式化代码块,请使用编辑器菜单上的{} 按钮或简单地将每行缩进四个空格。对于内联使用反引号`

标签: oracle inline-view


【解决方案1】:

从文件类型到历史的左连接:

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

【讨论】:

  • 不幸的是,这个查询仍然忽略了丢失的文件类型。
  • @LandonStatis 不可能。此查询保证返回所有文件类型。
【解决方案2】:

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

【讨论】:

  • 是的,UPLOAD_HISTORY 中可以有多个记录。但是状态的原因是:如果特定的电子邮件在 UPLOAD_HISTORY 中没有记录,我们将希望它返回,只返回应用程序将使用的电子邮件值和状态。 1 = 数据,0 = 无数据。但是,我会看看你提供的这个查询。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多