Oracle查询根据子表中的值对表进行过滤和排序

ybbs

我正在使用 Oracle 11g,我的数据和结构表如下:

TABLE1_PARENT:
-------------------
PID | Name  | Age |
-------------------
 1 | Mark   | 35  |
 2 | Jane   | 40  |
 3 | Agatha | 45  |
-------------------


TABLE2_CHILD
==============================================
CID | Name       | Age | Class | House | PID |
----------------------------------------------
 1 | John        | 7  |    3   | Red   |  1  |
 2 | Marie       | 5  |    1   | Yellow|  2  |
 3 | Petra       | 6  |    2   | Green |  3  |
 4 | Taylor      | 8  |    4   | Blue  |  2  |
 5 | Lean        | 9  |    5   | Red   |  2  |
 6 | Justin      | 7  |    3   | Yellow|  3  |
 7 | Arianna     | 5  |    1   | Blue  |  3  |
 8 | Brendon     | 6  |    2   | Green |  3  |
 9 | Shawn       | 7  |    3   | Red   |  1  |
----------------------------------------------

对于单个条件,查询很简单:

SELECT * FROM TABLE1_PARENT WHERE PID IN (SELECT PID FROM TABLE2_CHILD WHERE AGE=7);

这将导致以下结果:

TABLE1_PARENT:
-------------------
PID | Name  | Age |
-------------------
 1 | Mark   | 35  |
 3 | Agatha | 45  |
-------------------

但是,如果我想获取孩子年龄 = 7 且属于 house='GREEN' 的父母列表,如果我编写如下查询:

SELECT * FROM TABLE1_PARENT WHERE PID IN (SELECT PID FROM TABLE2_CHILD WHERE AGE=7 AND house='GREEN');

我不会得到任何结果。

我期待结果是:

TABLE1_PARENT:
-------------------
PID | Name  | Age |
-------------------
 3 | Agatha | 45  |
-------------------

因为 Agatha 有一个属于 age=7 的孩子,还有一个属于 house='GREEN' 的孩子。

我能够为使用 Java 流的类似数据结构提出一个解决方案。我正在尝试使用 Oracle SQL 做同样的事情。

List<Parent> filteredParents = parents.stream()
                .filter(parent -> parent.getChildren().stream()
                        .anyMatch(child -> child.getAge().equals("7")) && parent.getChildren().stream()
                        .anyMatch(child -> child.getHouse().equalsIgnoreCase("Green")))
                .collect(Collectors.toList());

我期待查询给我一个结果,其中条件可以匹配任何孩子。因为,过滤发生在父级。

任何帮助都会很棒。谢谢!

去世

你可以这样做EXISTS

SELECT t.* 
FROM TABLE1_PARENT t
WHERE t.PID IN (
  SELECT PID FROM TABLE2_CHILD WHERE AGE=7
) AND EXISTS (
  SELECT 1 FROM TABLE2_CHILD WHERE PID = t.PID AND House = 'Green'
)

您的查询的问题在于它试图在TABLE2_CHILD. 但这不是你想要的。
你想为这孩子行具有父IDSAGE = 7和里面有一排TABLE2_CHILDHouse = 'Green'
您可以在两种情况下都使用 EXISTS,这可能更有效:

SELECT t.* 
FROM TABLE1_PARENT t
WHERE EXISTS (
  SELECT 1 FROM TABLE2_CHILD WHERE PID = t.PID AND AGE=7
) AND EXISTS (
  SELECT 1 FROM TABLE2_CHILD WHERE PID = t.PID AND House = 'Green'
)

或通过将子表分组为条件聚合PID

SELECT * FROM TABLE1_PARENT
WHERE PID IN (
  SELECT PID
  FROM TABLE2_CHILD 
  GROUP BY PID
  HAVING
    SUM(CASE WHEN Age = 7 THEN 1 ELSE 0 END) > 0
    AND
    SUM(CASE WHEN House = 'Green' THEN 1 ELSE 0 END) > 0
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据第二个列表中的元素对列表进行排序和过滤

使用python根据索引和非索引列对表值进行排序

按mysql和wordpress列对表中的数据进行排序

根据值的时间序列对表中的值进行排序

在Google表格电子表格中按名称对表格进行排序的脚本

按列值对表格进行排序

Django如何根据相关模型对查询集进行过滤和排序

如何使用SQL查询在父级和子级之间对表记录进行排序

如何通过Lua中的值对表进行排序?

在PHP中对表多维数组数组进行排序和打印

根据选定的值过滤数据,在Google表格中按日期进行排序和计数

根据组合框中的值对表行中列出的选择字段进行排序

根据不同的字段和值进行排序

对表的行进行分组和排序

根据组和日期对表单进行排序。当团体人数不匹配时也要留空

如何使用Angular.js根据数字值对表格进行排序?

根据选项选择对表进行排序

根据条件对表进行排序和添加

jquery根据自定义列值对表行进行排序

根据 Angular 中的标题对表中单列中的数据进行排序

如何在lua中根据多个值对表进行排序?

如何根据子表列过滤LINQ查询?

根据下拉选项对表格进行排序

使用 PHP API 在 Google Drive 电子表格中对表格进行排序

如何使用Spring根据查询参数键和值进行过滤

根据值“移动窗口”范围和比例对表进行分类?

根据列表中的值对字典进行排序

按 R 中的列值对表行进行排序

根据特定的默认列对表进行排序