Страница 1 из 1
Как можно создать подзапрос с выборкой по битовой сумме?
Добавлено: 02 май 2006, 14:07
Aleksandr.
Таблица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
?
Добавлено: 02 май 2006, 14:45
Dimitry Sibiryakov
Без страшных тормозных извращений с ХП - никак. Делай это на клиенте.
Добавлено: 02 май 2006, 15:22
Aleksandr.
На клиенте дерьмово будет. Открыть набор в десяток тысяч записей, для каждой из которых откалькулировать текстовое выражение перебором данных - сомневаюсь, что хп медленнее отработает.
Добавлено: 03 май 2006, 08:01
Dimitry Sibiryakov
Во-первых, никто (в своем уме) набор в десяток тысяч записей не открывает. Во-вторых если ты предварительно вытянешь в массивчик всю таблицу битовых масок с расшифровками, то время на перебор никто и не заметит. Надеюсь, у тебя битовая маска не бесконечной длины?.. В-третьих для битовых масок есть методы и побыстрее перебора всех масок по таблице. Например, сдвиги.
В ХП ни второго ни третьего не сделать -> тормоза будут гарантированно больше.
Добавлено: 03 май 2006, 09:33
kdv
кстати, расшифровка масок действительно лучше всего делается на клиенте. я даже как то в детстве писал компонент CheckGroup и DBCheckGroup, по аналогии с RadioGroup.
тут можно сделать то же самое. Только у меня почти жестко обозначения битов были заданы. В общем случае их можно сначала считать с сервера, а потом по полученному списку "расшифровывать".
Добавлено: 03 май 2006, 11:50
Alex03
А если так:
Количество сочетаний масок конечно. В пределе 2^n где n кол-во используемых битов. В реальности обычно намного меньше.
Создаём 3-ю таблицу
ID - маска
МaskName - суммарное имя.
В которую в триггере по insert/update первой таблицы в случае необходимости добавляем запись.
В принципе можно и во вторую таблицу писать вместо третьей, если в маске более чем один бит в единице, то формировать имя по именам отдельных битиков.
Опять же если имена битиков маски условно константны. Если их часто менять то подход не очень.

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