0

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

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 构建映射表吗?

4

3 回答 3

2

尝试这个:

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

&按位与运算符

例如,

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 个兴趣,因此复杂性上的差异几乎不会引起注意。

于 2013-07-03T12:39:15.550 回答
1

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

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 演示

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

简单 - 只需加入RCTE_InterestsInterests

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 - 每个兴趣多行

SQLFiddle DEMO - 多行结果

于 2013-07-03T12:54:58.110 回答
0

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

Select * from TableA A Cross JOIN TableB B 
于 2013-07-03T12:37:56.983 回答