Я использую 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 и принадлежат к дому = 'ЗЕЛЕНЫЙ', если я напишу запрос, как показано ниже:
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 |
-------------------
так как у Агаты есть ребенок, принадлежащий к возрасту = 7, и ребенок, принадлежащий к дому = 'ЗЕЛЕНЫЙ'.
Мне удалось найти решение для аналогичной структуры данных с использованием потоков 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());
Я ожидаю, что запрос даст мне результат, при котором условия могут соответствовать любому из детей. Потому что фильтрация происходит на родительском уровне.
Любая помощь будет отличной. Спасибо!