1

Тема: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

Ось такі три таблиці:

id | item      it_id | trans    it_id | visual 
1  | один         1  | е           1  | а
                  1  | ю           1  | б
                                   1  | в

create table i (id integer, item varchar(10));
insert into i (id, item) values (1, 'один');

create table it (it_id integer, trans varchar(10));
insert into it (it_id, trans) values (1, 'е');
insert into it (it_id, trans) values (1, 'ю');

create table iv (it_id integer, visual varchar(10));
insert into iv (it_id, visual) values (1, 'а');
insert into iv (it_id, visual) values (1, 'б');
insert into iv (it_id, visual) values (1, 'в');

Як з них зробити отаку вибірку:

1 один е    а
1 один ю    б
1 один null в

Порядок елементів 'е', 'ю' і 'а', 'б', 'в' не важливий.

2 Востаннє редагувалося Yola (28.02.2017 13:06:44)

Re: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

Я от спробував таке

select * from iv left outer join (select * from i inner join it on id = it_id) as iit on id = iv.it_id ;

але вийшло щось занадто багато:

it_id | visual | id | item | it_id | trans
-------+--------+----+------+-------+-------
     1 | а      |  1 | один |     1 | е
     1 | а      |  1 | один |     1 | ю
     1 | б      |  1 | один |     1 | е
     1 | б      |  1 | один |     1 | ю
     1 | в      |  1 | один |     1 | е
     1 | в      |  1 | один |     1 | ю

3

Re: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

Біда в тім, що у Вас однакові айдішники. Для it_id = 1 і trans = 'e' підходить кожен із рядків останньої таблиці (у всіх теж id = 1), і так само для другого рядка, де trans = 'ю', підходять всі рядки, ось вам і 2 * 3 = 6 рядків у відповіді. Потрібно або міняти структуру таблиць/зв'язків, або думати над супер-запитом, можливо з використанням процедур, може ще щось. Я - за перший варіант )

Подякували: Monolith, Yola2

4

Re: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

Або робіть тимчасову таблицю, або розкажіть детальніше, що ви робите. JOIN-и не "склеюють" таблиці, а об'єднують рядки за певною ознакою.

Подякували: Yola1

5

Re: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

По-перше треба зробити id унікальними.

Подякували: Yola1

6 Востаннє редагувалося Yola (01.03.2017 12:19:40)

Re: Як написати запит, щоб поєднував дані з двох таблиць із null де треба

Насправді там повторів нема, в реальній базі it_id це зовнішній ключ на id.

Отже, докинув ще трохи рядків, щоб було наочніше:

insert into i (id, item) values (2, 'два');
 
insert into it (it_id, trans) values (2, 'ш');
insert into it (it_id, trans) values (2, 'щ');
 
insert into iv (it_id, visual) values (2, 'л');
insert into iv (it_id, visual) values (2, 'м');
insert into iv (it_id, visual) values (2, 'н');

і отакий запит мене більш-менш влаштував

(select id, item, visual, '' AS trans from i, iv where id = it_id)
UNION
(select id, item, '' AS visual, trans from i, it where id = it_id) order by id, trans;


id | item | visual | trans
----+------+--------+-------
  1 | один | в      |
  1 | один | б      |
  1 | один | а      |
  1 | один |        | е
  1 | один |        | ю
  2 | два  | н      |
  2 | два  | л      |
  2 | два  | м      |
  2 | два  |        | ш
  2 | два  |        | щ

Тобто, я хотів вибрати trans і visual властивості item'а, і так щоб не робити два запити.