Как выполнить объединение в SQL-запросе, используя значение с битовой маской

У меня возникли проблемы с поиском хорошего примера SQL-запроса для объединения двух таблиц, где объединяемое значение является значением битовой маски.

Таблица регионов

РегионБитовая маска Название региона 1 Север 2 Восток 4 Юг 8 Запад

Таблица XRef региона магазина

StoreID StoreCode МагазинРегион 1 100 3 2 101 1 3 102 9 4 103 8 5 104 12

Так что я получу такие результаты, как:

StoreID StoreCode МагазинРегион РегионБитовая маска Название региона 1 100 3 1 Север 1 100 3 2 Восток 2 101 1 1 Север 3 102 9 1 Север 3 102 9 8 Запад 4 103 8 8 Запад 5 104 12 4 Юг 5 104 12 8 Запад
select *
from StoreRegionXRef
     left join Region on StoreRegion & RegionBitmask = StoreRegion

Не дает ожидаемых результатов, всегда получается часть ожидаемых результатов или нет результатов.

Почему вы используете битовую маску, а не правильное отношение «многие ко многим»?

Thom A 16.07.2024 21:18

Я думаю, что-то вроде from StoreRegionXRef left join Region on StoreRegion & RegionBitmask = 1 ты бы доставил тебя на стадион. Вероятно, это будет не самое быстрое соединение, если у вас много данных.

JNevill 16.07.2024 21:28
StoreRegion & RegionBitmask > 0 обычно так это делают
siggemannen 16.07.2024 21:29
>0 имеет больше смысла
JNevill 16.07.2024 21:35

«Не дает ожидаемых результатов...» — укажите ожидаемые результаты.

The Impaler 16.07.2024 22:29

@Thom A Извините, я не понимаю, если вы язвительны, но если у вас есть предложение по лучшему представлению такой структуры данных, укажите пример, а не просто шумите.

CopperHead 18.07.2024 00:42

@siggemannen Спасибо за помощь. Теперь для меня это очевидно! Я бы дал вам +1, но пока не имею возможности сделать это из-за моей низкой репутации.

CopperHead 18.07.2024 00:50

Злой? Нет, примите мой вопрос за чистую монету: почему вы используете битовую маску, а не правильное отношение многие-ко-многим?

Thom A 18.07.2024 02:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя оператор & (побитовое И), вы можете объединить таблицы StoreRegionXref и StoreRegion:

SELECT *
from StoreRegionXRef 
  left join StoreRegion on StoreRegionXref.StoreRegion & StoreRegion.RegionBitmask > 0

Вы можете увидеть dbfiddle этого в действии здесь

Эта логика проверяет вашу битовую маску, чтобы увидеть, присутствует ли в ней соответствующий бит в вашей таблице StoreRegion.

@copperhead, это ответило на твой вопрос?

Dale K 17.07.2024 07:49

@JNeville Спасибо, что помогли прояснить мою теперь очевидную ошибку!

CopperHead 18.07.2024 00:39

Другие вопросы по теме