SQL

Есть две таблицы A и B, в таблице A 3 записи, в B — 4

В каждой таблице есть не уникальное, числовое, всегда заполненное поле driver_id

Необходимо заполнить таблицу, в которой будут минимальные и максимальные количества строк после выполнения запросов по шаблону:

select     count(*)

from       A

Тип джойна B

on         A.driver_id = B.driver_id

Тип джойна  MIN count(*) MAX count(*)

inner join  ?           ?

left join   3           ?

full join  ?            ?

Так как мы не знаем, какие данные хранятся в таблицах A и B, соответственно и количество строк при различных соединениях будет разным.

INSERT INTO A (DRIVER_ID) VALUES (0);

INSERT INTO A (DRIVER_ID) VALUES (0);

INSERT INTO A (DRIVER_ID) VALUES (0);

INSERT INTO B (DRIVER_ID) VALUES (1);

INSERT INTO B (DRIVER_ID) VALUES (1);

INSERT INTO B (DRIVER_ID) VALUES (1);

INSERT INTO B (DRIVER_ID) VALUES (1);

COMMIT WORK;

При таких данных мы получим минимальные значения при различных соединениях.

SELECT COUNT(*) FROM A JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- 0

SELECT COUNT(*) FROM A LEFT JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- 3 (В таблице A 3 записи)

SELECT COUNT(*) FROM A FULL JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- 7 (В таблице A 3 записи + 4 записи в таблице B. Итого 7 записей)

Если мы изменим данные в таблицах.

insert into A (driver_id) values (0);

insert into A (driver_id) values (0);

insert into A (driver_id) values (0);

insert into B (driver_id) values (0);

insert into B (driver_id) values (0);

insert into B (driver_id) values (0);

insert into B (driver_id) values (0);

COMMIT WORK;

При таких данных мы получим максимальные значения при различных соединениях.

SELECT COUNT(*) FROM A JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- (A * B = 12 записей)

SELECT COUNT(*) FROM A LEFT JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- (A * B = 12 записей)

SELECT COUNT(*) FROM A FULL JOIN B ON B.DRIVER_ID = A.DRIVER_ID; -- (A * B = 12 записей)

Итого:

select     count(*)

from       A

Тип джойна B

on         A.driver_id = B.driver_id

Тип джойна  MIN count(*) MAX count(*)

inner join  0           12

left join   3           12

full join   7            12

Tags:

Comments are closed.