如何通过按位操作符操作来执行SQL JOIN?

Sim*_*mon 1 sql t-sql sql-server bit-manipulation sql-server-2014

我们有一个SQL Server 2014包含两个表的数据库:

在此输入图像描述

在此输入图像描述

在Parts表中,BitColours是一个按位数,引用Colors表中的行.

我们被要求生成这样的查询:

在此输入图像描述

我从来没有做过这种类型的操作,所以会很感激任何指导.

谢谢

D-S*_*hih 6

您可以尝试通过AND按位运算符(&)连接两个表.

查询1:

SELECT
    p.id,
    p.part,
     STUFF((
          SELECT ',' + c.Colour
          FROM colours c
          WHERE c.BitId & p.BitColurs > 0
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') colours
FROM parts p 
Run Code Online (Sandbox Code Playgroud)

结果:

| id |   part |     colours |
|----|--------|-------------|
|  1 | abc123 |    Red,Blue |
|  2 | xyt788 | Black,Green |
Run Code Online (Sandbox Code Playgroud)

说明

& AND按位运算符将比较两个二进制值.

例如 :

BitColor3= 00011.

这是一个示例,我在二进制16之后忽略了很多零.

红色

    00011
---------------------
(&) 00001 = Red (1)
---------------------
    00001 = (1)
Run Code Online (Sandbox Code Playgroud)

蓝色

    00011
---------------------
(&) 00010 = Blue (2)
---------------------
    00010 = (2)
Run Code Online (Sandbox Code Playgroud)

黑色

    00011
---------------------
(&) 00100 = Black (4)
---------------------
    00000 = (0)
Run Code Online (Sandbox Code Playgroud)

绿色

    00011
---------------------
(&) 01000 = Green (8)
---------------------
    00000 = (0)
Run Code Online (Sandbox Code Playgroud)

所以我们可以使用 二进制计算BitIdBitColurs进行计算,得到更大的结果0意味着你可以得到这个值.

  • 当然,更好的解决方案是规范化数据库并添加partsToColors表,但是如果不可能的话,你的答案是好的. (3认同)