2015-09-02 39 views
0

我試圖通過將兩個表連接在一起創建視圖並不困難。但是有一個但是。在JOIN操作的SELECT過程中替換子記錄列

我基本上有兩張表。其中一個存儲項目和標籤之間的關聯,其他商店標籤以父母 - 子女形式存在(8個父母,每個4-6個孩子)。

請允許我說明開始與我的項目關聯表:

AssociationId | ItemId | TagId 
------------------------------ 
1    | 2  | 1 
2    | 10  | 2 
3    | 3  | 1 
4    | 5  | 7 
... 

我的標籤表:

TagId | ParentId | Name 
------------------------------ 
1  | NULL  | abc sds 
2  | 1  | sjdksd as 
3  | 1  | djfsd dfs d 
4  | NULL  | ujkjsd as 
... 

正如你可以看到每個家長可以通過與ParentId IS NULL裝飾查詢中找到。

SELECT ITA.AssociationId, ITA.ItemId, ITA.TagId, T.Name as TagName 
FROM Item_Tag_Association AS ITA 
INNER JOIN Tags AS T 
ON T.TagId = ITA.TagId 
WHERE T.ParentId IS NULL 

如果我是加入兩個表上TagIdParentId IS NULL我會找到父標籤的所有項目。

如果我要加入TagIdParentId IS NOT NULL這兩個表,我會找到所有帶有子標籤的項目。

但我真正想要的是一個項目和標籤的列表,其中的子標籤被替換爲他們的父標籤。

使用例如上面的結果會是這個樣子:

AssociationId | ItemId | TagId | TagName 
---------------------------------------- 
1    | 2  | 1  | abc sds 
2    | 10  | 1  | abc sds 
3    | 3  | 1  | abc sds 
4    | 5  | 7  | ysdasjdhas 
... 

至於爲什麼我想這樣做的原因是爲了讓我能得到的計數多少次特定父標籤(或該父母的孩子)已與某件物品相關聯。正如你現在所猜測的,每個孩子都應該爲其父母做出貢獻。

SELECT DISTINCT ItemId, TagId, TagName, COUNT(ItemId) OVER (PARTITION BY TagId) AS Count 
FROM vw_My_View 
ORDER BY Count DESC 

我正在使用SQL Server 2008 R2。所有建設性意見都是值得歡迎的

+0

@Tanner按我的問題最後一個表格說明了什麼期望的結果會是什麼樣子。 – iiminov

+0

好的,我認爲這是計數部分之前的中間步驟。 – Tanner

回答

1

只要你只需要在你的父/子層次一個層次,你可以做一個額外的從左邊的標籤加入到自己如果存在這樣找到父:

SELECT ita.AssociationId, ita.ItemId, ISNULL(parent.TagId, t.TagId), ISNULL(parent.Name, t.Name) AS TagName 
FROM Item_Tags_Association ita 
    JOIN Tags t ON ita.TagId = t.TagId 
    LEFT JOIN Tags parent ON t.ParentId = parent.TagId 

第一個(內)連接可以加入到子標籤或父標籤。如果中的關聯標記具有父項,則左連接將包含父標記。 ISNULL將確保使用第二個(左)連接的值(如果不爲null),否則使用第一個連接的值。

如果你不喜歡用ISNULL(或COALESCE)的交易,你可以使用一個UNIONCTE這樣的:

WITH ParentTags AS (SELECT * FROM Tags WHERE ParentId IS NULL) 
SELECT ita.AssociationId, ita.ItemId, t.TagId, t.Name AS TagName 
FROM ParentTags t 
    JOIN Item_Tags_Association ita ON ita.TagId = t.TagId 
UNION ALL 
SELECT ita.AssociationId, ita.ItemId, t.TagId, t.Name AS TagName 
FROM ParentTags t 
    JOIN Tags child ON t.TagId = child.ParentId 
    JOIN Item_Tags_Association ita ON ita.TagId = child.TagId 
+0

@Iarsts你認爲正確的父/子層次將只有一個級別。 – iiminov

+0

我可以確認''ISNULL''解決方案正在工作,但我還不知道如何/爲什麼。但是使用''ISNULL()''很聰明。 – iiminov

+0

試圖添加一個解釋到帖子。基本上,左連接在那裏包含來自父標籤的信息_if_它存在(如果標籤在關聯中有一個parentid定義)。 isnull用於使用來自此父標記的值(如果找到的話),否則使用第一個連接的值(這將是不帶parentid的標記 - >這意味着它是父標記開頭)。這個有點麻煩的解釋,希望你明白。 – larsts