2013-07-03 17 views
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建立映射表嗎?

回答

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個興趣點,所以複雜性的差異應該很難察覺。

+0

現在只是測試它 - 它看起來不錯,謝謝:) –

0

在兩個表格之間使用交叉連接並僅選擇所需的列。

Select * from TableA A Cross JOIN TableB B 
+0

我不太明白這是怎麼工作的? –

1

您可以使用遞歸CTE來計算interesets的所有組合和剛剛加入就可以了:

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) 

編輯:後從評論額外的信息,我看到查詢沒有真正返回完全預期的答案。這裏是額外的調整來獲取多記錄多記錄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 - multiple rows per interest

SQLFiddle DEMO - multiple rows results

+0

謝謝nenad,如果我從性能角度來決定我需要走這條路。兩件小事情雖然 - 1.我不會立即建立表(我可以調整以照顧)。 2.你的映射表逗號定義了興趣點 - 我想按照我的例子實際返回多個記錄。你可以調整它嗎? –

+0

@LeeTickett是的 - 當然,我會更新答案。也會建議只使用查詢來填充表格,並且只有在某些情況發生變化時才運行它。 –