У меня возникли проблемы с поиском хорошего примера SQL-запроса для объединения двух таблиц, где объединяемое значение является значением битовой маски.
Таблица регионов
Таблица XRef региона магазина
Так что я получу такие результаты, как:
select *
from StoreRegionXRef
left join Region on StoreRegion & RegionBitmask = StoreRegion
Не дает ожидаемых результатов, всегда получается часть ожидаемых результатов или нет результатов.
Я думаю, что-то вроде from StoreRegionXRef left join Region on StoreRegion & RegionBitmask = 1
ты бы доставил тебя на стадион. Вероятно, это будет не самое быстрое соединение, если у вас много данных.
StoreRegion & RegionBitmask > 0
обычно так это делают
>0
имеет больше смысла
«Не дает ожидаемых результатов...» — укажите ожидаемые результаты.
@Thom A Извините, я не понимаю, если вы язвительны, но если у вас есть предложение по лучшему представлению такой структуры данных, укажите пример, а не просто шумите.
@siggemannen Спасибо за помощь. Теперь для меня это очевидно! Я бы дал вам +1, но пока не имею возможности сделать это из-за моей низкой репутации.
Злой? Нет, примите мой вопрос за чистую монету: почему вы используете битовую маску, а не правильное отношение многие-ко-многим?
Используя оператор &
(побитовое И), вы можете объединить таблицы StoreRegionXref
и StoreRegion
:
SELECT *
from StoreRegionXRef
left join StoreRegion on StoreRegionXref.StoreRegion & StoreRegion.RegionBitmask > 0
Вы можете увидеть dbfiddle этого в действии здесь
Эта логика проверяет вашу битовую маску, чтобы увидеть, присутствует ли в ней соответствующий бит в вашей таблице StoreRegion
.
@copperhead, это ответило на твой вопрос?
@JNeville Спасибо, что помогли прояснить мою теперь очевидную ошибку!
Почему вы используете битовую маску, а не правильное отношение «многие ко многим»?