Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите сделать селект / 25 сообщений из 25, страница 1 из 1
15.09.2010, 16:35
    #36848396
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Помогите сделать селект!
Есть таблица со сложным PK (KEYID1, KEYID2, KEYID3, KEYID4, STAMP)
Причем

KEYID1-BIGINT (не identity)
KEYID2-BIGINT (не identity)
KEYID3-BIGINT (не identity)
KEYID4-BIGINT (не identity)
STAMP-дата

Таблица содержит такие данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   KEYID1	KEYID2	KEYID3	KEYID4	STAMP
    19 	 2 	 1 	 1 	 23 - 08 - 2010 
    20 	 1 	 1 	 1 	 23 - 08 - 2010 
    40 	 1 	 1 	 1 	 23 - 08 - 2010 
    3 	 2 	 1 	 1 	 24 - 08 - 2010 
    19 	 1 	 1 	 1 	 24 - 08 - 2010     вот эта запись
    19 	 2 	 1 	 1 	 24 - 08 - 2010 
    20 	 1 	 1 	 1 	 24 - 08 - 2010 
    40 	 1 	 1 	 1 	 24 - 08 - 2010 
    3 	 2 	 1 	 1 	 25 - 08 - 2010 
    19 	 1 	 1 	 1 	 25 - 08 - 2010 
    19 	 2 	 1 	 1 	 25 - 08 - 2010 
    20 	 1 	 1 	 1 	 25 - 08 - 2010 
    40 	 1 	 1 	 1 	 25 - 08 - 2010 

Проблема: нужно получить последнюю запись в таблице используя составной ключ (дата идет по наростающей)
Т.е. последняя запись была (в таблице стрелочкой указана), нужно получить все значение после нее.
Поделитесь опытом плиз!!!!
...
Рейтинг: 0 / 0
15.09.2010, 16:51
    #36848483
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Вопрос не совсем понятен.
Сортировать по группе полей можно так:
Код: plaintext
1.
2.
3.
4.
replace(char(cast(keyid1 as decimal( 31 ))), ' ', '0') ||
replace(char(cast(keyid2 as decimal( 31 ))), ' ', '0') ||
replace(char(cast(keyid3 as decimal( 31 ))), ' ', '0') ||
replace(char(cast(keyid4 as decimal( 31 ))), ' ', '0') ||
char(stamp, ISO)
...
Рейтинг: 0 / 0
16.09.2010, 01:41
    #36849241
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Отсортировать то не проблема, проблема сделать выборку по полям, чтобы выселектелись все данные после указанной строки!

Т.е.

select * from table
where [тут условие отбора которое я не знаю как сделать]>[чего-то]

в итоге должно выйти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
KEYID1	KEYID2	KEYID3	KEYID4	STAMP
    19 	 2 	 1 	 1 	 24 - 08 - 2010 
    20 	 1 	 1 	 1 	 24 - 08 - 2010 
    40 	 1 	 1 	 1 	 24 - 08 - 2010 
    3 	 2 	 1 	 1 	 25 - 08 - 2010 
    19 	 1 	 1 	 1 	 25 - 08 - 2010 
    19 	 2 	 1 	 1 	 25 - 08 - 2010 
    20 	 1 	 1 	 1 	 25 - 08 - 2010 
    40 	 1 	 1 	 1 	 25 - 08 - 2010 
...
Рейтинг: 0 / 0
16.09.2010, 02:01
    #36849252
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
условие сортировки напиши пожалуйста


там что-то вроде
where STAMP >= '24-08-2010' AND NOT ( STAMP = '24-08-2010' AND .... )

но я писал такое, если найду завтра исходник, то покажу
...
Рейтинг: 0 / 0
16.09.2010, 04:37
    #36849277
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Любопытно. Можете объяснить, что значит "последняя запись"? И как отсортированы записи в вашем примере? Если имеется ввиду порядок их вставки в таблицу, то он не обязан быть постоянным. В таком случае лучше завести поле с отметкой времени вставки строки.
...
Рейтинг: 0 / 0
16.09.2010, 08:40
    #36849332
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
BuryCommonerЛюбопытно. Можете объяснить, что значит "последняя запись"? И как отсортированы записи в вашем примере? Если имеется ввиду порядок их вставки в таблицу, то он не обязан быть постоянным. В таком случае лучше завести поле с отметкой времени вставки строки.

Опс, сории не так объяснил!

Значит так: есть таблица с данными с начала года. Ключ как писал выше составной. Из этой таблицы делаю выгрузку в др. базу, т.е. первая "заливка" забирает все записи что были (допустим до 05.05.2010). Следующая заливка должна забрать все "новые" записи, причем новые записи также могут садиться 05.05.2010-го. Вот я и спрашиваю как выбрать только "новые" записи!
Поля отсортированы по ключу, т.е.

Код: plaintext
...ORDER BY stamp, keyid1, keyid2, keyid3, keyid4
...
Рейтинг: 0 / 0
16.09.2010, 08:58
    #36849352
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Т.е. нужно сделать селект, где

Код: plaintext
1.
select * from table
where .... > .....
...
Рейтинг: 0 / 0
16.09.2010, 11:24
    #36849677
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
qi_ip,

ниже код на с++, который формирует where условие как раз для твоего случая.
код рабочий 100%

думаю, можно понять, что он делает

SQL не напишу, потому что SQL я давно забыл, да и времени нет....



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
    sprintf(szWhere, " WHERE ");
    w  = szWhere;
    w += strlen(w);
    int bracket =  0 ;
    while(pPrimaryKeys)
    {
      if ( bracket ==  0 )
      {
          strcpy ( w, " ( "); w+=strlen(w);
          strcpy ( w, pPrimaryKeys->szColName); w += strlen(w);
          if(pPrimaryKeys->pNextKey)
          {
             strcpy ( w, " >= "); w+=strlen(w);
          }  else
          {
              strcpy ( w, " > "); w+=strlen(w);
          }
          strcpy ( w, pPrimaryKeys->szStringValue); w+=strlen(w);
          strcpy ( w, " ) "); w+=strlen(w);
          if(pPrimaryKeys->pNextKey)
          {
            bracket =  2 ;
          } else
          {
            break;
          }
      } // if ( bracket ==  0 )
      else
      {
          strcpy( w, " AND NOT ( "); w+=strlen(w);
          primaryKey *p = pPrimaryKeys;

          int equals =  0 ;
          while( equals != bracket - 1  )
          {
             strcpy ( w , p->szColName); w += strlen(w);
             strcpy ( w , " = "); w +=strlen(w);
             strcpy ( w , p->szStringValue); w += strlen(w);
             strcpy ( w , " AND "); w +=strlen(w);
             p = p->pNextKey;
             ++equals;
          }
          if(p->pNextKey)
          {
             strcpy ( w , p->szColName); w += strlen(w);
             strcpy ( w , " < "); w +=strlen(w);
             strcpy ( w , p->szStringValue); w += strlen(w);
             strcpy(w, " ) "); w +=strlen(w);
             ++bracket;
             continue;
          } else
          {
             strcpy ( w , p->szColName); w += strlen(w);
             strcpy ( w , " <= "); w +=strlen(w);
             strcpy ( w , p->szStringValue); w += strlen(w);
             strcpy(w, " ) "); w +=strlen(w);
             break;
          }
      }// else

    } // while


...
Рейтинг: 0 / 0
16.09.2010, 11:37
    #36849723
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
да, ORDER BY вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    strcpy(szOrderBy," ORDER BY ");
    char *o = szOrderBy;
    o +=strlen(o);

    // clear
    while(pPrimaryKeys)
   {
       primaryKey *p = pPrimaryKeys;
       strcpy (o, p->szColName); o += strlen(o);
       *o++ = ',';
       *o   = '\0';
       pPrimaryKeys = pPrimaryKeys->pNextKey;
       delete p;
   }
   if(','==o[- 1 ]) o [- 1 ] =  0 ;
...
Рейтинг: 0 / 0
16.09.2010, 11:59
    #36849794
Tshind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Можно попробовать следующий вариант

1. есть таблица t1 в БД bd1, есть таблица t2 в БД bd2; перечень колонок одинаков.
2. сделать в БД bd1 nickname t2_nick на таблицу t2 из БД bd2.
3. в БД bd1 выполнить select, который покажет разницу записей в таблицах t1 и t2:
select * from t1
except
select * from t2_nick with ur;
4. если структура таблиц t1 и t2 различна, то в select из п.3 вместо * перечислить
только сравниваемые колонки
5. потом можно использовать insert into select во временную таблицу или сразу в t2_nick

у меня этот вариант работает в 8.2 очень давно и применяется для проверки работы
репликации.
...
Рейтинг: 0 / 0
16.09.2010, 12:51
    #36849991
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Делается очень просто при помощи аналитической функции DENSE_RANK
...
Рейтинг: 0 / 0
16.09.2010, 13:01
    #36850029
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
drop table dr@

create table dr ( 
    c1 int not null,
    c2 int not null,
    c3 int not null,
    c4 int not null,
    primary key (c1,c2,c3,c4)
)
@

insert into dr (c1,c2,c3,c4) values
( 1 , 3 , 0 , 1 ),
( 3 , 2 , 1 , 0 ),
( 5 , 1 , 1 , 6 ),
( 0 , 2 , 2 , 1 )
@


select * from dr order by c1,c2,c3,c4
@

select 
  dense_rank() over( order by c1 desc,c2 desc,c3 desc,c4 desc) dr,
  c1,c2,c3,c4
  from dr order by c1,c2,c3,c4
@

select 
    c1,c2,c3,c4
from
    ( select 
        dense_rank() over( order by c1 desc,c2 desc,c3 desc,c4 desc) dr,
        c1,c2,c3,c4
     from dr order by c1,c2,c3,c4
    ) t
where
    dr= 1 
@


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
drop table dr
DB20000I  The SQL command completed successfully.

create table dr ( c1 int not null, c2 int not null, c3 int not null, c4 int not null, primary key (c1,c2,c3,c4) )
DB20000I  The SQL command completed successfully.

insert into dr (c1,c2,c3,c4) values ( 1 , 3 , 0 , 1 ), ( 3 , 2 , 1 , 0 ), ( 5 , 1 , 1 , 6 ), ( 0 , 2 , 2 , 1 )
DB20000I  The SQL command completed successfully.

select * from dr order by c1,c2,c3,c4

C1          C2          C3          C4
----------- ----------- ----------- -----------
           0             2             2             1 
           1             3             0             1 
           3             2             1             0 
           5             1             1             6 

   4  record(s) selected.


select dense_rank() over( order by c1 desc,c2 desc,c3 desc,c4 desc) dr, c1,c2,c3,c4 from dr order by c1,c2,c3,c4

DR                   C1          C2          C3          C4
-------------------- ----------- ----------- ----------- -----------
                    4             0             2             2             1 
                    3             1             3             0             1 
                    2             3             2             1             0 
                    1             5             1             1             6 

   4  record(s) selected.


select c1,c2,c3,c4 from ( select dense_rank() over( order by c1 desc,c2 desc,c3 desc,c4 desc) dr, c1,c2,c3,c4 from dr order by c1,c2,c3,c4 ) t where dr= 1 

C1          C2          C3          C4
----------- ----------- ----------- -----------
           5             1             1             6 

   1  record(s) selected.

...
Рейтинг: 0 / 0
16.09.2010, 14:14
    #36850228
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
gardenmanпример:

Код: plaintext
1.
2.

Мне нужно не найти какую-то конкретную запись, а выселектить значения после этой записи!
...
Рейтинг: 0 / 0
16.09.2010, 14:15
    #36850232
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select *
from
  (select *
  from
    (select *, char(stamp, ISO) ||
    replace(char(cast(keyid1 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid2 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid3 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid4 as decimal( 31 ))), ' ', '0') as orderfield
    from thistable) q1
  order by orderfield) q2
where orderfield <= char('2010-08-24', ISO) ||
replace(char(cast( 19  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0')
После знака "<=" менять данные при каждой последующей загрузке.
...
Рейтинг: 0 / 0
16.09.2010, 14:35
    #36850295
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
qi_ip,
Когда мне нужно было такое делать, я создавал в таблице вычисляемое поле (типа - конкатенации от ключей), строил по нему индекс - и работал.
...
Рейтинг: 0 / 0
16.09.2010, 16:34
    #36850752
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
BuryCommoner
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select *
from
  (select *
  from
    (select *, char(stamp, ISO) ||
    replace(char(cast(keyid1 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid2 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid3 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid4 as decimal( 31 ))), ' ', '0') as orderfield
    from thistable) q1
  order by orderfield) q2
where orderfield <= char('2010-08-24', ISO) ||
replace(char(cast( 19  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0')
После знака "<=" менять данные при каждой последующей загрузке.

Вот полная выборка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
ID_PE	ORDERFIELD
 1 	 2010 - 04 - 02300000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 2 	 2010 - 04 - 02300000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 3 	 2010 - 04 - 02500000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 4 	 2010 - 04 - 02600000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 5 	 2010 - 04 - 02900000000000000000000000000000000200000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 6 	 2010 - 04 - 02110000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 7 	 2010 - 04 - 02120000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 8 	 2010 - 04 - 02120000000000000000000000000000000100000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 9 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 10 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 11 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000300000000000000000000000000000000100000000000000000000000000000000 
 12 	 2010 - 04 - 02160000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 13 	 2010 - 04 - 02180000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 14 	 2010 - 04 - 02190000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 15 	 2010 - 04 - 02310000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 16 	 2010 - 04 - 03300000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 17 	 2010 - 04 - 03300000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 18 	 2010 - 04 - 03500000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 19 	 2010 - 04 - 03600000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 20 	 2010 - 04 - 03900000000000000000000000000000000200000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 21 	 2010 - 04 - 03110000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 

Вот мой селект

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select *
from
  (select *
  from
    (select id_pe, char(stamp, ISO) ||
    replace(char(cast(keyid1 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid2 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid3 as decimal( 31 ))), ' ', '0') ||
    replace(char(cast(keyid4 as decimal( 31 ))), ' ', '0') as orderfield
    from thistable) q1
  order by orderfield) q2
where orderfield <= char('2010-04-02') ||
replace(char(cast( 19  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 2  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0') ||
replace(char(cast( 1  as decimal( 31 ))), ' ', '0')

Выдает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID_PE	ORDERFIELD
 6 	 2010 - 04 - 02110000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 7 	 2010 - 04 - 02120000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 8 	 2010 - 04 - 02120000000000000000000000000000000100000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 9 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 10 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 11 	 2010 - 04 - 02150000000000000000000000000000000100000000000000000000000000000000300000000000000000000000000000000100000000000000000000000000000000 
 12 	 2010 - 04 - 02160000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 13 	 2010 - 04 - 02180000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 

Теряются записи с 1 по 5

Если >

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ID_PE	ORDERFIELD
 1 	 2010 - 04 - 02300000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 2 	 2010 - 04 - 02300000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 3 	 2010 - 04 - 02500000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 4 	 2010 - 04 - 02600000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 5 	 2010 - 04 - 02900000000000000000000000000000000200000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
 15 	 2010 - 04 - 02310000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 16 	 2010 - 04 - 03300000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 17 	 2010 - 04 - 03300000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 18 	 2010 - 04 - 03500000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 19 	 2010 - 04 - 03600000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000000 
 20 	 2010 - 04 - 03900000000000000000000000000000000200000000000000000000000000000000200000000000000000000000000000000100000000000000000000000000000000 
Появляются записи с 1 по 5
...
Рейтинг: 0 / 0
16.09.2010, 17:19
    #36850889
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
говорю же, тот код, который я привёл, генерит корректрое where условие
можно чуть дописать, запустить программку, и будет счастье

самому просто некогда сейчас, если я это сделаю, то не сегодня


я тогда чуть голову не сломал, когда писал тот код, но всё работает!
только давно это было, и я забыл как where выглядит
...
Рейтинг: 0 / 0
16.09.2010, 17:22
    #36850902
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
там для общнго случая написано, когда есть N ключей
...
Рейтинг: 0 / 0
16.09.2010, 17:51
    #36850986
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Новый Годтам для общнго случая написано, когда есть N ключей
Ок ок понятно! Тоже этот вариант смотрю ))))
...
Рейтинг: 0 / 0
16.09.2010, 18:18
    #36851060
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
qi_ip, извиняюсь. Видимо у вас что-то не так обрабатывается. У меня функция char() по другому себя ведет.
qi_ipТеряются записи с 1 по 5
Это потому, что у вас почему-то
Код: plaintext
replace(char(cast( 16  as decimal( 31 ))), ' ', '0') = '160000000000000000000000000000000'
У меня же
Код: plaintext
replace(char(cast( 16  as decimal( 31 ))), ' ', '0') = '0000000000000000000000000000016.0'
Принципиальное отличие в том, что у вас значащие разряды идут слева. В результате при строковой сортировке строка '2010-04-02900...' будет больше, чем '2010-04-02110...' и '2010-04-02120...'.
...
Рейтинг: 0 / 0
16.09.2010, 18:50
    #36851102
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
drop table dr@
create table dr ( 
    c1 int not null,
    c2 int not null,
    c3 int not null,
    c4 int not null,
    primary key (c1,c2,c3,c4)
)
@
insert into dr (c1,c2,c3,c4) values
( 1 , 3 , 0 , 1 ),
( 3 , 2 , 1 , 0 ),
( 5 , 1 , 1 , 6 ),
( 4 , 2 , 1 , 9 ),
( 5 , 0 , 1 , 9 ),
( 4 , 2 , 3 , 9 ),
( 4 , 1 , 0 , 9 ),
( 4 , 3 , 3 , 1 ),
( 4 , 6 , 5 , 2 ),
( 0 , 2 , 2 , 1 )
@
select * from dr order by c1,c2,c3,c4
@
with 
    key (c1,c2,c3,c4) as (
       values ( 4 , 1 , 0 , 9 )   /*  типа стартовая запись */
    )
select
    dr.* 
from
    dr,
    key
where
    (dr.c1 > key.c1)
    or ( (dr.c1 = key.c1) and (dr.c2 > key.c2) )
    or ( (dr.c1 = key.c1) and (dr.c2 = key.c2) and (dr.c3 > key.c3) )
    or ( (dr.c1 = key.c1) and (dr.c2 = key.c2) and (dr.c3 = key.c3) and (dr.c4 > key.c4) )
order by  1 , 2 , 3 , 4 
@

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table dr ( c1 int not null, c2 int not null, c3 int not null, c4 int not null, primary key (c1,c2,c3,c4) )
DB20000I  The SQL command completed successfully.

insert into dr (c1,c2,c3,c4) values ( 1 , 3 , 0 , 1 ), ( 3 , 2 , 1 , 0 ), ( 5 , 1 , 1 , 6 ), ( 4 , 2 , 1 , 9 ), ( 5 , 0 , 1 , 9 ), ( 4 , 2 , 3 , 9 ), ( 4 , 1 , 0 , 9 ), ( 4 , 3 , 3 , 1 ), ( 4 , 6 , 5 , 2 ), ( 0 , 2 , 2 , 1 )
DB20000I  The SQL command completed successfully.

select * from dr order by c1,c2,c3,c4

C1          C2          C3          C4
----------- ----------- ----------- -----------
           0             2             2             1 
           1             3             0             1 
           3             2             1             0 
           4             1             0             9 
           4             2             1             9 
           4             2             3             9 
           4             3             3             1 
           4             6             5             2 
           5             0             1             9 
           5             1             1             6 

   10  record(s) selected.


with key (c1,c2,c3,c4) as ( values ( 4 , 1 , 0 , 9 ) ) select dr.* from dr, key where (dr.c1 > key.c1) or ( (dr.c1 = key.c1) and (dr.c2 > key.c2) ) or ( (dr.c1 = key.c1) and (dr.c2 = key.
 2 ) and (dr.c3 > key.c3) ) or ( (dr.c1 = key.c1) and (dr.c2 = key.c2) and (dr.c3 = key.c3) and (dr.c4 > key.c4) ) order by  1 , 2 , 3 , 4 

C1          C2          C3          C4
----------- ----------- ----------- -----------
           4             2             1             9 
           4             2             3             9 
           4             3             3             1 
           4             6             5             2 
           5             0             1             9 
           5             1             1             6 

   6  record(s) selected.


quit
DB20000I  The QUIT command completed successfully.

Типа так что-ли?
...
Рейтинг: 0 / 0
16.09.2010, 18:52
    #36851104
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Между прочим у вас там ключ не совсем удовлетворяет требованиям запроса.
таймстемп должно впереди идти.
...
Рейтинг: 0 / 0
17.09.2010, 09:57
    #36851671
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
BuryCommonerqi_ip, извиняюсь. Видимо у вас что-то не так обрабатывается. У меня функция char() по другому себя ведет.
qi_ipТеряются записи с 1 по 5
Это потому, что у вас почему-то
Код: plaintext
replace(char(cast( 16  as decimal( 31 ))), ' ', '0') = '160000000000000000000000000000000'
У меня же
Код: plaintext
replace(char(cast( 16  as decimal( 31 ))), ' ', '0') = '0000000000000000000000000000016.0'
Принципиальное отличие в том, что у вас значащие разряды идут слева. В результате при строковой сортировке строка '2010-04-02900...' будет больше, чем '2010-04-02110...' и '2010-04-02120...'.

Странно, хотя в по cookbook должно быть как у вас...у меня вот так получилось

Код: plaintext
select digits(cast( 31  as decimal( 50 ))) from sysibm.SYSDUMMY1

результат
Код: plaintext
 00000000000000000000000000000000000000000000000031 
...
Рейтинг: 0 / 0
17.09.2010, 10:17
    #36851700
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
Спасибо. Теперь буду знать, что вместо char(cast()) можно использовать digits() :)
...
Рейтинг: 0 / 0
17.09.2010, 12:30
    #36851986
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать селект
BuryCommonerСпасибо. Теперь буду знать, что вместо char(cast()) можно использовать digits() :)
Вам также спасибо за помощь! Также спасибо Новый Год , Tshind и gardenman
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите сделать селект / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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