如何连接整数“二进制”复合键

时间:2013-07-03 12:32:13

标签: sql sql-server binary

我有一个包含整数的列的表,当转换为二进制时,该表表示兴趣的排列。例如:

John, Smith, 6
David, Jones, 512
Mark, Clark, 2

假设我们的Interests表格类似于:

1, TV
2, Music
4, Current Affairs
...
512, Sport

我希望我的输出为:

John, Smith, Music
John, Smith, Current Affairs
David, Jones, Sport
Mark, Clark, Music

表中目前有15个兴趣,留下2 ^ 15种可能的排列(我认为)。

目前我唯一能想到的是使用某种循环/游标来构建一个映射表,其中包含我可以加入的每个排列。

还有其他方法吗? (我想知道我是否可以将每个兴趣放在表中并在连接标准中使用一个函数来查看该位是否为该兴趣设置了?)

或者您可以协助SQL构建映射表吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT S.Name, S.Surname, I.Name
FROM SomeTable S
JOIN Interests I
  ON I.ID & S.InterestCombinedID > 0

&bitwise AND operator

例如,

2 & 6 = 10b  & 110b = 10b  = 2 > 0  and
4 & 6 = 100b & 110b = 100b = 4 > 0

因此John Smith(6)将与Music(2)和Current Affairs(4)匹配。

不幸的是,这不会允许索引(据我所知)。为了允许索引,您可能不得不在Interest表上为每个设置的位(使用循环或CTE)(或更改表结构)求助。显然这会更复杂,并且,由于目前只有15个兴趣,复杂性的差异应该是难以察觉的。

答案 1 :(得分:1)

您可以使用递归CTE计算所有intesets组合并加入它:

WITH RCTE_Interests AS 
(
    SELECT  id, CAST(name AS NVARCHAR(MAX)) interests FROM dbo.Interests i
    UNION ALL 
    SELECT r.id + i.id, r.interests + ',' + i.name FROM RCTE_Interests r
    INNER JOIN dbo.Interests i ON i.ID > r.ID
)
SELECT t.name, t.lastname, r.interests 
FROM RCTE_Interests r
INNER JOIN Table1 t ON r.id = t.id
OPTION (MAXRECURSION 0)

<强> SQLFiddle DEMO

编辑:在评论的其他信息之后,我看到查询并没有真正返回到预期的答案。这是额外的调整,以获取多兴趣ID的多个记录的记录。

简单 - 只需将RCTE_Interests加入Interests表:

WITH RCTE_Interests AS 
(
    SELECT  id, CAST(name AS NVARCHAR(MAX)) interests FROM dbo.Interests i
    UNION ALL 
    SELECT r.id + i.id, r.interests + ',' + i.name FROM RCTE_Interests r
    INNER JOIN dbo.Interests i ON i.ID > r.ID
)
SELECT r.ID, i.Name AS interests 
FROM RCTE_Interests r
INNER JOIN dbo.Interests i ON r.interests LIKE '%' + i.name + '%'
ORDER BY r.ID

<强> SQLFiddle DEMO - multiple rows per interest

<强> SQLFiddle DEMO - multiple rows results

答案 2 :(得分:0)

在两个表之间使用交叉连接,并仅选择所需的列。

Select * from TableA A Cross JOIN TableB B