Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как выбрать в таблице отсутствующие номера / 25 сообщений из 38, страница 1 из 2
24.04.2015, 11:41
    #38944341
Prima_0101
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Привет,
помогите, пожалуйста, написать запрос:

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

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

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

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

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

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

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

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

совершенно верно.
...
Рейтинг: 0 / 0
24.04.2015, 12:42
    #38944449
Prima_0101
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Pallaris,
это может быть хорошей идеей - нужно попробовать...ну и научиться это делать :)
...
Рейтинг: 0 / 0
24.04.2015, 12:55
    #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
24.04.2015, 12:55
    #38944470
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Prima_0101Добрый Э - Эх,

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

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

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

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

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

не заработало молча? или поругалось как-то?
...
Рейтинг: 0 / 0
24.04.2015, 14:07
    #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
24.04.2015, 14:10
    #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
24.04.2015, 14:14
    #38944604
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Prima_0101DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAMEА какая у вас СУБД?
судя по найденному в яндексе, это DB2.
...
Рейтинг: 0 / 0
24.04.2015, 14:28
    #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
24.04.2015, 14:30
    #38944631
Как выбрать в таблице отсутствующие номера
Prima_0101DSNT408I SQLCODE = -204, ERROR: QXI7488.T IS AN UNDEFINED NAMEтут-то как раз все понятно - "Т - неопределенное имя" Или другими словами - "объекта с именем Т в базе не существует"
...
Рейтинг: 0 / 0
24.04.2015, 14:36
    #38944638
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Извиняюсь, что не по теме, но в базе реально такие названия таблиц и полей?
Код: sql
1.
2.
3.
                                         
         select snr_num +1 as hb                                    
           from qxi7488.vkda76 t0                                   
...
Рейтинг: 0 / 0
24.04.2015, 14:37
    #38944639
Prima_0101
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать в таблице отсутствующие номера
Добрый Э - Эх,

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

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


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