Как можно создать подзапрос с выборкой по битовой сумме?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Aleksandr.
Сообщения: 63
Зарегистрирован: 18 май 2005, 19:13

Как можно создать подзапрос с выборкой по битовой сумме?

Сообщение Aleksandr. » 02 май 2006, 14:07

Таблица1 имеет поле, в котором хранится битовая сумма, например:
ID Mask
1 6 (2 OR 4)
Таблица2 содержит непосредственно маски для битов с описанием:
ID MaskName
2 Маска2
4 Маска4
8 Маска8

Как можно в запросе к Таблице1 с соединием Таблицы2 получить запись в виде
Таблица1.ID Таблица1.Mask MaskNames
1 6 Маска2, Маска4
?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 02 май 2006, 14:45

Без страшных тормозных извращений с ХП - никак. Делай это на клиенте.

Aleksandr.
Сообщения: 63
Зарегистрирован: 18 май 2005, 19:13

Сообщение Aleksandr. » 02 май 2006, 15:22

На клиенте дерьмово будет. Открыть набор в десяток тысяч записей, для каждой из которых откалькулировать текстовое выражение перебором данных - сомневаюсь, что хп медленнее отработает.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 03 май 2006, 08:01

Во-первых, никто (в своем уме) набор в десяток тысяч записей не открывает. Во-вторых если ты предварительно вытянешь в массивчик всю таблицу битовых масок с расшифровками, то время на перебор никто и не заметит. Надеюсь, у тебя битовая маска не бесконечной длины?.. В-третьих для битовых масок есть методы и побыстрее перебора всех масок по таблице. Например, сдвиги.
В ХП ни второго ни третьего не сделать -> тормоза будут гарантированно больше.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 май 2006, 09:33

кстати, расшифровка масок действительно лучше всего делается на клиенте. я даже как то в детстве писал компонент CheckGroup и DBCheckGroup, по аналогии с RadioGroup.
тут можно сделать то же самое. Только у меня почти жестко обозначения битов были заданы. В общем случае их можно сначала считать с сервера, а потом по полученному списку "расшифровывать".

Alex03
Сообщения: 15
Зарегистрирован: 16 ноя 2005, 19:02

Сообщение Alex03 » 03 май 2006, 11:50

А если так:
Количество сочетаний масок конечно. В пределе 2^n где n кол-во используемых битов. В реальности обычно намного меньше. :)

Создаём 3-ю таблицу
ID - маска
МaskName - суммарное имя.
В которую в триггере по insert/update первой таблицы в случае необходимости добавляем запись.

В принципе можно и во вторую таблицу писать вместо третьей, если в маске более чем один бит в единице, то формировать имя по именам отдельных битиков.
Опять же если имена битиков маски условно константны. Если их часто менять то подход не очень.

:) Изврат конечно, но в ряде случаев может обоснован?

Ответить