SQL: выбрать из нескольких таблиц с несколькими ключами - PullRequest
0 голосов
/ 27 июня 2019

У меня есть три таблицы

ТАБЛИЦА A

| id1 | code |
|-----|------|
| 201 | CLA0 | 
|   3 | CQS2 |
| 393 | WQS1 |

ТАБЛИЦА B

| id1 | id2 | name |
|-----|-----|------|
| 201 |  44 | pluto|
|   3 | 201 | pippo|
| 393 |  67 | pluto|
| 701 | 444 | pappa|

ТАБЛИЦА C

| id2 | area |
|-----|------|
|  44 |   5  |
| 201 |   5  |
|  67 |  10  |
| 444 |   1  |

Все записи имеют однуотдельный идентификатор 1 и один отдельный идентификатор 2 (ключи).

Запись может иметь или не иметь код

Запись может иметь или не иметь площадь

Значения области 1, 5 и10

Я хотел бы иметь эту таблицу (полный список записей, с id2, именем и кодом - если доступно):

| id2 | name | code |
|-----|------|------|
|  44 | pippo| CLA0 |
| 201 | pappa|      |

т.е. мне нужно

1) выберите столбцы "id2" и "name" из ТАБЛИЦЫ B

2) если "id2" одинаков для A и B, также выберите "code" из ТАБЛИЦЫ A. Если id2 недоступенТАБЛИЦА B, затем перечислите id2 со значением нулевого кода

3) показать только записи, для которых область = 5

Я не уверен, как поступить, потому что мне нужно выбрать столбцы из трех таблиц, иключ, который меня интересует, только в двух из них.

1 Ответ

0 голосов
/ 27 июня 2019

Я думаю, что это просто обычное соединение и внешнее соединение с фильтрацией:

select b.id2, b.name, c.code
from b join
     c
     on b.id2 = c.id2 left join
     a
     on b.id1 = c.id1
where c.area = 5;

Поскольку в c есть дубликаты, exists лучше:

select b.id2, b.name, c.code
from c left join
     a
     on b.id1 = c.id1
where exists (select 1 from c where c.id2 = b.id2 and c.area = 5);
...