У меня есть вид таблицы T как:

id | C1   | C2  |
---+------+-----+
1  | pat  | 190 |
1  | pat1 | 191 |
1  | A5   | 302 |
2  | pet  | 190 |
2  | pet1 | 191 |
2  | A5   | 302 |
3  | pit  | 190 |
3  | pit1 | 191 |
3  | A6   | 302 |

Хотел бы получить:

id | C1   | C2  |
---+------+-----+
1  | pat  | 190 |
2  | pet  | 190 |

Другими словами, вернуть id, где C2 = 190, где в другом месте таблицы указано A5.

Пробовал несколько подходов LEFT JOIN, но никуда не попал. Пожалуйста помоги. Thanx .

0
John Miller 28 Май 2019 в 14:14

2 ответа

Лучший ответ

Вы должны существовать:

select t.*
from tablename t
where c2 = 190
and exists (
  select 1 from tablename where id = t.id and c1 = 'A5'
)

См. демонстрационную версию.
Полученные результаты:

| id  | C1  | C2  |
| --- | --- | --- |
| 1   | pat | 190 |
| 2   | pet | 190 |
2
forpas 28 Май 2019 в 11:29

Вы можете использовать EXISTS, чтобы проверить, существует ли строка с c1 = 'A5' для идентификатора.

SELECT *
       FROM t t1
       WHERE t1.c2 = 190
             AND EXISTS (SELECT *
                                FROM t t2
                                WHERE t2.id = t1.id
                                      AND t2.c1 = 'A5');
0
sticky bit 28 Май 2019 в 11:29