Таблица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
?
Как можно создать подзапрос с выборкой по битовой сумме?
-
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Во-первых, никто (в своем уме) набор в десяток тысяч записей не открывает. Во-вторых если ты предварительно вытянешь в массивчик всю таблицу битовых масок с расшифровками, то время на перебор никто и не заметит. Надеюсь, у тебя битовая маска не бесконечной длины?.. В-третьих для битовых масок есть методы и побыстрее перебора всех масок по таблице. Например, сдвиги.
В ХП ни второго ни третьего не сделать -> тормоза будут гарантированно больше.
В ХП ни второго ни третьего не сделать -> тормоза будут гарантированно больше.
кстати, расшифровка масок действительно лучше всего делается на клиенте. я даже как то в детстве писал компонент CheckGroup и DBCheckGroup, по аналогии с RadioGroup.
тут можно сделать то же самое. Только у меня почти жестко обозначения битов были заданы. В общем случае их можно сначала считать с сервера, а потом по полученному списку "расшифровывать".
тут можно сделать то же самое. Только у меня почти жестко обозначения битов были заданы. В общем случае их можно сначала считать с сервера, а потом по полученному списку "расшифровывать".
А если так:
Количество сочетаний масок конечно. В пределе 2^n где n кол-во используемых битов. В реальности обычно намного меньше.
Создаём 3-ю таблицу
ID - маска
МaskName - суммарное имя.
В которую в триггере по insert/update первой таблицы в случае необходимости добавляем запись.
В принципе можно и во вторую таблицу писать вместо третьей, если в маске более чем один бит в единице, то формировать имя по именам отдельных битиков.
Опять же если имена битиков маски условно константны. Если их часто менять то подход не очень.
Изврат конечно, но в ряде случаев может обоснован?
Количество сочетаний масок конечно. В пределе 2^n где n кол-во используемых битов. В реальности обычно намного меньше.

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