powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как выбрать в таблице отсутствующие номера
38 сообщений из 38, показаны все 2 страниц
Как выбрать в таблице отсутствующие номера
    #38944341
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
помогите, пожалуйста, написать запрос:

Есть таблица с порядковыми номерами. Некоторые номера отсуствуют. Их нужно выбрать.
Большое спасибо.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944345
Prima_0101,

в общем случае из базы можно выбрать лишь то, что присутствует.
а чего отсутствует - то выбрать нельзя. можно только сгенерировать.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944358
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prima_0101
Есть таблица с порядковыми номерами. Некоторые номера отсуствуют. Их нужно выбрать.
Большое спасибо.

Делаешь селект с сортировкой по порядковому номеру, и потом где-то в цикле при переборе записей, если разница между номерами предыдущей и текущей записи больше 1, выводишь
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944362
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

спасибо за быстрый ответ.
Тогда как сгенерировать?

(по идее, отсутствующий номер можно вычислить: SNR_OUT = SNR_IN + 1)?
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944380
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,

спасибо за ответ. Проблема в том, что при 10 миллионах записей переберать их в цикле программы очень долго.
Нужно решение методами СУБД.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944389
Prima_0101,

положим, в базе будут значения 1 и 1000000.
Чего должно быть на выходе? массив данных из 999998 строк со значениями от 2 до 999999 ?
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944407
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prima_0101Нужно решение методами СУБД.

Сделай хранимую процедуру
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944435
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

совершенно верно.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944449
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,
это может быть хорошей идеей - нужно попробовать...ну и научиться это делать :)
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944469
Prima_0101,

как вариант - начни решать задачу поэтапно.
на первом этапе получи все диапазоны "дырок" в виде "начало дыры - кончало дыры"
на втором этапе сгенерируй строки от начала до кончала каждой дыры.

Примерно таким запросом можно поискать дырки (исходная таблица - t, поле с нумерацией - n. замени их на свои названия):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select hb as hb, min(he) as he
  from ( -- все начала дырок:
         select n + 1 as hb
           from t t0
          where not exists(select null from t t1 where t1.n = t0.n + 1)
            and     exists(select null from t t1 where t1.n > t0.n)
       ) v_b
  join
       ( -- все кончала дырок
         select n - 1 as he
           from t t0
          where not exists(select null from t t1 where t1.n = t0.n - 1)
            and     exists(select null from t t1 where t1.n < t0.n)
       ) v_e
    on hb <= he
 group by hb
 order by 1
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944470
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prima_0101Добрый Э - Эх,

совершенно верно.

оптимальнее будет выводить не 99998 записей в случае пропуска от 2 до 100000, а одну запись с полем start = 3 и полем amount = 99998.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944473
Добрый Э - Эх,

в качестве оптимизации [NOT]EXISTS-подзапросов можно воспользоваться [LEFT]JOIN-ом
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944475
Pallaris,

ну или абсолютные значения "начало - кончало" дырок...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944485
кстати, если прикрутить "переменные" , то, возможно, будет гораздо проще вычислить интервалы дырок...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944491
Добрый Э - Эхкстати, если прикрутить "переменные" , то, возможно, будет гораздо проще вычислить интервалы дырок...хотя нет, соврал... переменные хорошо лягут на обратную задачу - если нужно будет свернуть имеющиесы в таблице непрерывные интервалы до вида: "начало непрерывного интервала - кончало непрерывного интервала"...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944552
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

спасибо за код. Круто, конечно.
Так снаскоку, правда, не заработало.
Попробую осмыслить суть.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944569
Prima_0101,

не заработало молча? или поругалось как-то?
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944594
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

тупо подставила в код свои таблицы и свои поля

select hb as hb, min(he) as he
from (
select snr_num +1 as hb
from qxi7488.vkda76 t0
where not exists(select null from
qxi7488.vkda76 t1 where t1.snr_num = t0.snr_num + 1)
and exists(select null from
qxi7488.vkda76 t1 where t1.snr_num > t0.snr_num)
) v_b
join
(
select n - 1 as he
from t t0
where not exists(select null from
qxi7488.vkda76 t1 where t1.snr_num = t0.snr_num - 1)
and exists(select null from
qxi7488.vkda76 t1 where t1.snr_num < t0.snr_num)
) v_e
on hb <= he
group by hb
order by 1

Выдало непонятно что:

DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAME
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944598
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

тупо подставила в код свои таблицы и свои поля:

select hb as hb, min(he) as he
from (
select snr_num +1 as hb
from qxi7488.vkda76 t0
where not exists(select null from
qxi7488.vkda76 t1 where t1.snr_num = t0.snr_num + 1)
and exists(select null from
qxi7488.vkda76 t1 where t1.snr_num > t0.snr_num)
) v_b
join
(
select n - 1 as he
from t t0
where not exists(select null from
qxi7488.vkda76 t1 where t1.snr_num = t0.snr_num - 1)
and exists(select null from
qxi7488.vkda76 t1 where t1.snr_num < t0.snr_num)
) v_e
on hb <= he
group by hb
order by 1

Выдало непонятно что:

DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAME
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944604
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prima_0101DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAMEА какая у вас СУБД?
судя по найденному в яндексе, это DB2.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944628
Prima_0101тупо подставила в код свои таблицы и свои поля:не до подставляла. менять нужно было всё выделенное:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select hb as hb, min(he) as he
  from ( -- все начала дырок:
         select n + 1 as hb
           from t t0
          where not exists(select null from t t1 where t1.n = t0.n + 1)
            and     exists(select null from t t1 where t1.n > t0.n)
       ) v_b
  join
       ( -- все кончала дырок
         select n - 1 as he
           from t t0
          where not exists(select null from t t1 where t1.n = t0.n - 1)
            and     exists(select null from t t1 where t1.n < t0.n)
       ) v_e
    on hb <= he
 group by hb
 order by 1
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944631
Prima_0101DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAMEтут-то как раз все понятно - "Т - неопределенное имя" Или другими словами - "объекта с именем Т в базе не существует"
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944638
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, что не по теме, но в базе реально такие названия таблиц и полей?
Код: sql
1.
2.
3.
                                         
         select snr_num +1 as hb                                    
           from qxi7488.vkda76 t0                                   
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944639
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

да, только где у меня в коде такой объект QXI7488.T ?
или он динамически генериться ?
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944642
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,

да, все в реале.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944649
Prima_0101Добрый Э - Эх,

да, только где у меня в коде такой объект QXI7488.T ?
или он динамически генериться ?QXI7488 - это, скорее всего, имя схемы, базы данных или че там есть в твоей СУБД...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944650
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prima_0101да, только где у меня в коде такой объект QXI7488.T ?


from t - вместо t пишешь QXI7488
where t1.n = t0.n + 1 - вместо n пишешь vkda76

Синтаксис SQL совсем не знаешь, возьми книжку какую-нибудь
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944657
Prima_0101,

и, кстати, если у тебя и в самом деле DB/2, то свернуть портянку дыр в диапазоны можно гораздо проще, посредством оконных функций [ LEAD | LAG ] OVER()
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944660
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisfrom t - вместо t пишешь QXI7488
where t1.n = t0.n + 1 - вместо n пишешь vkda76


Хотя если qxi7488 - это не таблица, тогда я не прав
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944683
PallarisPallarisfrom t - вместо t пишешь QXI7488
where t1.n = t0.n + 1 - вместо n пишешь vkda76


Хотя если qxi7488 - это не таблица, тогда я не правQXI7488 - это имя схемы данных. что-то типа аналога "базы данных". то есть в рамках одной общей базы в DB/2 могут быть разные схемы данных. такие своеобразные "логические контейнеры" для объектов отдельно-взятой системы - таблиц, индексов, процедур, функций и т.д. и т.п.. Если запрашиваем объекты текущей схемы, имя схемы можно не писать (просто пишем select * from T). если хотим обратиться к объектам другой схемы, то требуется указывать перед именем таблицы имя этой схемы (select * from QXI7488.T)...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944713
Добрый Э - Эхкак вариант - начни решать задачу поэтапно.
на первом этапе получи все диапазоны "дырок" в виде "начало дыры - кончало дыры"
на втором этапе сгенерируй строки от начала до кончала каждой дыры. по итогу, в рамках DB/2 первый этап делаем на LEAD (...) Over(order by ...), второй этап можно сделать на рекурсивном WITH.
Но это уже лучше обсуждать в профильной ветке ...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944716
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

ага, это я затупил. Но названия у схем и таблиц оригинальные, сразу разработчику понятно, что к чему :)

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944764
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prima_0101,

Добрый день.

Для MYTABLE (I INT)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with b (i, mx) as (
select min(i) i, max(i) mx
from mytable
  union all
select i+1, mx
from b
where i<mx
)
select i
from b
where not exists (select 1 from mytable a where a.i=b.i)
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944825
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,

да, это DB2 и SQL
Tаблица здесь qxi7488.vkda76
Столбец snr_num

но в данном случае методы MySQL должны по идее прокатить в SQL.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944912
Prima_0101,

Дело в том, что MySQL-ный диалект SQL-ля сильно скуднее в своих возможностях, чем его DB/2-шный аналог...
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944915
Mark Barinstein,

При всем моём уважении, но зачем же генерить весь диапазон значений? Уж лучше делать это именно для дыр. В особенности, если дыр не много и они не сильно широкие.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38944971
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Это самое простое готовое решение, не требующее процедурной логики. Не будет устраивать производительность, можно и другими способами решить. И далеко еще не факт, что эти другие способы будут более производительными.
...
Рейтинг: 0 / 0
Как выбрать в таблице отсутствующие номера
    #38946104
Prima_0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, всем большое спасибо за участие и помощь.

пока решили воспользоваться тривиальными методами:

- находить первую дырку

SELECT (SNR_NUM +1) AS SNR_NUM_NEU
FROM QXI7488.VKDA76 A
AND NOT EXISTS (SELECT * FROM QXI7488.VKDA76 B
WHERE B.SNR_NUM = A.SNR_NUM + 1 )

FETCH FIRST ROW ONLY

- потом находим конец дырки

- потом в программе в цикле генерим недостающие номера


На досуге можно будет порассуждать о предложенных вами более красивых решениях.

Всем большое спасибо и хорошего дня.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как выбрать в таблице отсутствующие номера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]