2016-10-28 23 views
0

對於Excel導出,我必須爲每個項目添加兩列,其所有「has-reference-to」和「is-referenced-from」項目。結合自引用表中的行

Here is my SQL Fiddle with my tables and my results.

我的表

CREATE TABLE Item (ItemId INT, Title NVARCHAR(100)) 
INSERT INTO Item VALUES(1, 'Title 1') 
INSERT INTO Item VALUES(2, 'Title 2') 
INSERT INTO Item VALUES(3, 'Title 3') 
INSERT INTO Item VALUES(4, 'Title 4') 
INSERT INTO Item VALUES(5, 'Title 5') 

CREATE TABLE ItemReference (ReferenceId INT, FromItemId INT, ToItemId INT) 
INSERT INTO ItemReference VALUES(1, 1, 2) 
INSERT INTO ItemReference VALUES(2, 1, 3) 
INSERT INTO ItemReference VALUES(3, 4, 5) 
INSERT INTO ItemReference VALUES(4, 5, 1) 

兩個FromItemIdToItemId包含從表ItemItemId

預計輸出

+---------+------------------+--------------------+ 
| Title | Has reference to | Is referenced from | 
+---------+------------------+--------------------+ 
| Title 1 | Title 2, Title 3 | Title 5   | 
+---------+------------------+--------------------+ 
| Title 2 |     | Title 1   | 
+---------+------------------+--------------------+ 
| Title 3 |     | Title 1   | 
+---------+------------------+--------------------+ 
| Title 4 | Title 5   |     | 
+---------+------------------+--------------------+ 
| Title 5 | Title 1   | Title 4   | 
+---------+------------------+--------------------+ 

我查詢

SELECT item.Title, 
    ISNULL([Has reference to], '') [Has reference to], 
    ISNULL([Is referenced from], '') [Is referenced from] 
FROM Item item 
OUTER APPLY 
(
    SELECT i.Title + ', ' 
    FROM ItemReference ref 
    INNER JOIN Item i ON ref.FromItemId = i.ItemId 
    WHERE ref.FromItemId = item.ItemId 
    ORDER BY ref.ToItemId DESC 
    FOR XML PATH('') 
) OURT ([Has reference to]) 
OUTER APPLY 
(
    SELECT i.Title + ', ' 
    FROM ItemReference ref 
    INNER JOIN Item i ON ref.ToItemId = i.ItemId 
    WHERE ref.ToItemId = item.ItemId 
    ORDER BY ref.FromItemId DESC 
    FOR XML PATH('') 
) OURF ([Is referenced from]) 

電流輸出

+---------+------------------+--------------------+ 
| Title | Has reference to | Is referenced from | 
+---------+------------------+--------------------+ 
| Title 1 | Title 1, Title 1 | Title 1   | 
+---------+------------------+--------------------+ 
| Title 2 |     | Title 2   | 
+---------+------------------+--------------------+ 
| Title 3 |     | Title 3   | 
+---------+------------------+--------------------+ 
| Title 4 | Title 4   |     | 
+---------+------------------+--------------------+ 
| Title 5 | Title 5   | Title 5   | 
+---------+------------------+--------------------+ 

由於您可以看到,項目引用的數量與我的預期結果相符,但我無法獲得引用的正確標題。任何人都可以幫助我獲得正確的標題嗎?

+0

在這兩種外部應用中,這不就是標題(不是i.Title)嗎? BTW你的小提琴沒有加載我(可能是我的連接)。 –

+0

對於我來說,SQL小提琴一直很慢/不能工作。無法加載它。也許直接複製/粘貼create/insert語句。 –

+0

@CetinBasoz表'ItemReference'沒有'Title'列... –

回答

1

對不起,我的無知裁判沒有物品欄,沒有數據樣本我看不到樹,我認爲:)

SELECT item.Title, 
    ISNULL([Has reference to], '') [Has reference to], 
    ISNULL([Is referenced from], '') [Is referenced from] 
FROM @Item item 
OUTER APPLY 
(
    SELECT i.Title + ', ' 
    FROM @ItemReference ref 
    INNER JOIN @Item i ON ref.ToItemId = i.ItemId 
    WHERE ref.FromItemId = item.ItemId 
    ORDER BY ref.ToItemId DESC 
    FOR XML PATH('') 
) OURT ([Has reference to]) 
OUTER APPLY 
(
    SELECT i.Title + ', ' 
    FROM @ItemReference ref 
    INNER JOIN @Item i ON ref.FromItemId = i.ItemId 
    WHERE ref.ToItemId = item.ItemId 
    ORDER BY ref.FromItemId DESC 
    FOR XML PATH('') 
) OURF ([Is referenced from]); 

鏈接應該ref.To和ref.From(分別爲ref.From和ref.To)。

編輯:順便說一句,因爲它的順序是標題3,標題2.我不知道它是否是你想要的。

+0

哦,所以這只是我的連接錯誤...謝謝:) –