【问题标题】:Joining two tables with grouped elements in Oracle sql在 Oracle sql 中使用分组元素连接两个表
【发布时间】:2019-03-18 13:13:53
【问题描述】:

所以我有以下两个表(简化):

表 1:文件夹

ID    | DESC_FOLDER | TEMPLATE_ID
---------------------------------
...   | ...         | ...
20    | Folder 1    | 52
21    | Folder 2    | 55
...   |             | ...

表 2:模板

ID    | DESC_TEMPLATE | GROUP
-----------------------------
...   | ...           | ...
51    | Template 1    | abc
52    | Template 2    | abc
53    | Template 3    | abc
54    | Template 4    | abc
55    | Template 5    | NULL
...   | ...           | ...

结果应该是一个包含所有模板及其对应文件夹的列表。

预期结果:

DESC_TEMPLATE | DESC_FOLDER 
---------------------------
Template 1    | Folder 1  
Template 2    | Folder 1
Template 3    | Folder 1
Template 4    | Folder 1  
Template 5    | Folder 2

我对分组模板有疑问,因为每个组中只有一个模板连接到文件夹。下面的 sql 命令显然只返回直接连接到文件夹的模板。如何扩展我的命令以获得所需的输出?

Select 
    T.DESC_TEMPLATE, 
    F.DESC_FOLDER
from 
    TEMPLATES T, 
    FOLDERS F
where
    T.ID = F.TEMPLATE_ID

非常感谢您的帮助!

【问题讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!
  • 预期结果是否真的与示例表数据匹配?
  • 是的,我只是仔细检查了一遍:-)。模板 1-4 组合在一起(“abc”)。模板 2 连接到文件夹 1,因此该组中的所有其他模板也连接到文件夹 1。
  • 好的,现在我明白了。

标签: sql oracle join


【解决方案1】:

我认为窗口函数可以解决您的问题:

Select T.DESC_TEMPLATE, 
       MAX(F.DESC_FOLDER) OVER (PARTITION BY t.GROUP) as DESC_FOLDER
from TEMPLATES T left join
     FOLDERS F
     on T.ID = F.TEMPLATE_ID;

【讨论】:

  • 太棒了,就像一个魅力,谢谢!现在我只需要了解你在那里做了什么:-)
【解决方案2】:
where
    T.ID = F.TEMPLATE_ID (+)

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    相关资源
    最近更新 更多