Начало » Использование СУБД » Firebird, HQbird, InterBase » Выборка значений отсутствующих во второй таблице
Выборка значений отсутствующих во второй таблице [сообщение #3914] |
Mon, 11 December 2023 18:46 |
inoremap
Сообщений: 12 Зарегистрирован: August 2023
|
Junior Member |
|
|
В базе данных Firebird SQL 3.0.7 есть две таблицы:
create table A (ID integer not null primary key, F integer not null);
create table B (ID integer not null primary key, F integer not null);
insert into A (ID, F) values (1, 101);
insert into A (ID, F) values (2, 102);
insert into A (ID, F) values (3, 103);
insert into B (ID, F) values (1, 101);
insert into B (ID, F) values (2, 102);
insert into B (ID, F) values (4, 104);
Индексов по F нет и добавить их нет возможности, значения F не повторяются.
Нужно получить те значения поля F из таблицы A которых нет в поле F таблицы B.
Это можно сделать запросом:
select
A.F
from
A
left outer join
B on B.F = A.F
where
B.F is null
но, т. к. нет индекса по F, то получается 3 чтения из A и 3*3 чтения из B, а хочется уложится в 3 чтения из A и 3 из B.
Сделал вариант с проходом по двум отсортированным выборкам:
execute block returns (f int)
as
declare a_f int;
declare b_f int;
declare b_c cursor for (select F from B order by F);
declare b_eof boolean;
begin
open b_c;
fetch b_c into :b_f;
b_eof = row_count = 0;
for select F from A order by F into :a_f do
begin
while ((a_f > b_f) and (not b_eof)) do
begin
fetch b_c into :b_f;
b_eof = row_count = 0;
if (b_eof) then
leave;
end
if ((a_f < b_f) or b_eof) then
begin
f = a_f;
suspend;
end
end
end
он вроде бы работает, но выглядит несколько громоздким, существует ли более простой способ с числом чтений не больше чем сумма записей A и B?
|
|
|
|
|
|
Переход к форуму:
Текущее время: Sun Nov 24 23:05:24 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00738 секунд
|