Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Задача про цвета парт / 14 сообщений из 14, страница 1 из 1
14.09.2005, 17:51
    #33269744
PumpkinHead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Есть таблица t(Room,Row,TableColor,DataColumn)
Room - это класс, Row - ряд, а TableColor - ID цветов парт, DataColumn - колонка с данными. TableColor может принимать значения 1,2,3,4,5.
Необходимо дополнить таблицу так, чтобы если в заданном классе и заданном ряду нет парт с цветом из списка, в теблице все равно появилась бы строчка c недостающим цветом и нулевым значением в колонке DataColumn
Пример:
RoomRowTableColorDataColumn111300114600
После выполнения запроса должно быть
RoomRowTableColorDataColumn111300112011301146001150
...
Рейтинг: 0 / 0
14.09.2005, 18:51
    #33269864
S4etovod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Под SQL Server, правда, но думаю что разницы с Sybase нет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create table #c( cid int )

insert #c select  1 
insert #c select  2 
insert #c select  3 
insert #c select  4 
insert #c select  5 
create table #t( room int, row int, tablecolor int, datacolumn int )
insert #t select t.room, t.row, #c.cid,  0  from t, #c group by t.room, t.row
update #t set datacolumn = t.datacolumn from t where t.room = #t.room and t.row = #t.row

delete from t
insert t select * from #t

-- Или так:
-- insert t select * from #t 
-- where not exists( select * from t where t.room = #t.room and t.row = #t.row )

drop table #t
drop table #c

Можно и без #t обойтись.
...
Рейтинг: 0 / 0
15.09.2005, 09:42
    #33270353
PumpkinHead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
S4etovod, то что надо, благодарю.
А все-таки интересно, а как без #t, в которой таблички перемножаются, обойтись?
...
Рейтинг: 0 / 0
15.09.2005, 10:26
    #33270470
PumpkinHead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Кстати, небольшое исправление

-- Или так:
-- insert t select * from #t
-- where not exists( select * from t where t.room = #t.room and t.row = #t.row and t.TableColor=#t.TableColor)
...
Рейтинг: 0 / 0
16.09.2005, 02:50
    #33272352
S4etovod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
PumpkinHeadКстати, небольшое исправление
-- Или так:
-- insert t select * from #t
-- where not exists( select * from t where t.room = #t.room and t.row = #t.row and t.TableColor=#t.TableColor)
Конечно. Склероз... %-((( Писал от фонаря, SQL Server'а дома не держу, ещё не хватало :-)
PumpkinHeadА все-таки интересно, а как без #t, в которой таблички перемножаются, обойтись?
Думаю что никак. Вот можно сократить #t до
Код: plaintext
create table #t( room int, row int )
потом
Код: plaintext
1.
2.
insert #t select t.room, t.row group by t.room, t.row
insert t select #t.room, #t.row, #c.cid,  0  from #t, #c 
where not exists(select * from tt where tt.room = #t.room and tt.row = #t.row and tt.TableColor=#c.cid )
Интересно, можно ли совсем без #t?
...
Рейтинг: 0 / 0
16.09.2005, 06:24
    #33272411
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Для ASA9 будет просто:
Код: 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.
// Таблица примера
CREATE TABLE tRoom (
  Room int NOT NULL,
  Row int NOT NULL,
  TableColor tinyint NOT NULL,
  DataColumn int NOT NULL,
  PRIMARY KEY (Room, Row, TableColor)
);

// Данные примера
INSERT INTO tRoom VALUES ( 1 ,  1 ,  1 ,  300 );
INSERT INTO tRoom VALUES ( 1 ,  1 ,  4 ,  600 );
// Дополнительные данные
INSERT INTO tRoom VALUES ( 1 ,  2 ,  2 ,  100 );
INSERT INTO tRoom VALUES ( 1 ,  2 ,  5 ,  200 );

COMMIT;

// Решение поставленной задачи
// (добавляем в таблицу примера все нехватающие цвета по Room=1 и Row=1)
INSERT INTO tRoom ON EXISTING SKIP WITH AUTO NAME
  SELECT  1  AS Room,  1  AS Row, g.row_num AS TableColor,  0  AS DataColumn
  FROM sa_RowGenerator( 1 ,  5 ) g;

COMMIT;

// Выводим результат
SELECT *
FROM tRoom
ORDER BY Room, Row, TableColor;
RoomRowTableColorDataColumn111300112011301146001150122100125200
INSERT ON EXISTS SKIP добавит только те записи, значение которых по PK нет в таблице, а так как у нас в таблице PK: Room, Row, TableColor - то как раз и добавяться недостающие цвета по 1 комнате и 1 ряду.
"sa_rowgenerator" - системная хранимая процедура. Она сгенерирует набор данных с полем row_num в указанном параметрами диапазоне.
Вообще, если TableColor используется часто, то имеет смысл вынести его в отдельную нормальную таблицу с записями. Или в крайнем случае в представление типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE VIEW TableColors
AS
  SELECT  1  AS TableColor
  UNION ALL
  SELECT  2 
  UNION ALL
  SELECT  3 
  UNION ALL
  SELECT  4 
  UNION ALL
  SELECT  5 ;
...
Рейтинг: 0 / 0
16.09.2005, 12:18
    #33273238
S4etovod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
ASCRUS, а конструкция INSERT ON EXISTS SKIP специфична для ASA9?
В MS SQL Server такого вроде нет? :..-(
PS: Время отправки Вашего поста - 06:24. Если в 9 утра программист м.б. только ещё на работе, но не уже , то Вы в 06:24, видимо, ещё ;-)
...
Рейтинг: 0 / 0
16.09.2005, 12:19
    #33273245
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
S4etovod wrote:

> а конструкция *INSERT ON EXISTS SKIP* специфична для ASA9?

ASA 8.0.2 и выше.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16.09.2005, 18:35
    #33274479
PumpkinHead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
ASCRUS,
Большое спасибо за пример, очень любопытно.
Правда, я нарушил правила форума и не назвал сервер - ASE12.
Каюсь, что я недостаточно четко сформулировал задачу. Речь на самом деле шла о том, чтобы дополнять таблицу строками не по конкретной комбинации Room+Row, а по всем, по которым есть хоть одна строчка в таблице. То есть я хотел на самом деле, чтобы резульат был не такой, как получился у Вас (но Вы решили немного другую задачу по моей вине, кстати), а вот какой (на Ваших тестовых данных) :
RoomRowTableColorDataColumn111300 1120 1130 114600 11501210 122100 12301240125200
Вариант S4etovod-а под ASE12 эту задачу решает. Получится ли у ASA сделать это красиво?
...
Рейтинг: 0 / 0
17.09.2005, 08:41
    #33274751
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Берем за основу мой пример, меняем только сам код добавления записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
INSERT INTO tRoom ON EXISTING SKIP WITH AUTO NAME
  SELECT r.Room, r.Row, g.row_num AS TableColor,  0  AS DataColumn
  FROM sa_RowGenerator( 1 ,  5 ) g
    CROSS JOIN (
      SELECT DISTINCT Room, Row
      FROM tRoom
    ) AS r
На выходе имеем:
RoomRowTableColorDataColumn111300112011301146001150121012210012301240125200
...
Рейтинг: 0 / 0
17.09.2005, 08:49
    #33274752
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
На TSQL ASA, который для совместимости с MSSQL и ASE не имеет наворотов WatcomSQL, это выглядело бы так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
INSERT INTO tRoom (Room, Row, TableColor, DataColumn)
  SELECT r.Room, r.Row, g.TableColor,  0 
  FROM (SELECT  1  AS TableColor
        UNION ALL
        SELECT  2 
        UNION ALL
        SELECT  3 
        UNION ALL
        SELECT  4 
        UNION ALL
        SELECT  5 
      ) AS g,
      (SELECT DISTINCT Room, Row
       FROM tRoom) AS r
  WHERE NOT EXISTS(
          SELECT *
          FROM tRoom
          WHERE Room = r.Room AND
                Row = r.Row AND
                TableColor = g.TableColor);
Код конечно подлиннее получается, но в принципе суть та же. Для последних версий ASE, поддерживающих подзапросы, наверное этот код то же будет работать.
...
Рейтинг: 0 / 0
17.09.2005, 08:50
    #33274753
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
S4etovodPS: Время отправки Вашего поста - 06:24. Если в 9 утра программист м.б. только ещё на работе, но не уже , то Вы в 06:24, видимо, ещё ;-)
Я не с работы писал этот пост, а с дома. Обычно по будням я где то в 5 утра встаю, есть время поделать свои дела до работы ;)
...
Рейтинг: 0 / 0
17.09.2005, 13:54
    #33274883
S4etovod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Sorry. Ещё раз.
ASCRUS S4etovodPS: Время отправки Вашего поста - 06:24. Если в 9 утра программист м.б. только ещё на работе, но не уже , то Вы в 06:24, видимо, ещё ;-)
Я не с работы писал этот пост, а с дома. Обычно по будням я где то в 5 утра встаю, есть время поделать свои дела до работы ;)
В 5 утра... по будням... Бррр...
Я-то думал, что физиологически оптимальный график по будням - вставать в 10 (утра), на работе с 12 до 20-22, потом свободное время и в койку в 2-3ч.
...
Рейтинг: 0 / 0
17.09.2005, 19:32
    #33275060
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача про цвета парт
Если у человека есть режим, не важно в какое время он спит, а в какое встает :) Главное, чтобы был режим :)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Задача про цвета парт / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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