Соединение двух столов обратно на себя - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь написать запрос с некоторыми необычными объединениями.Я знаю, что это можно сделать, но я не помню, как это сделать.

Вот мой запрос, как он есть сейчас:

SELECT  parentLink.SourceWorkItemID, parentLink.TargetWorkItemID,
            childLink.SourceWorkItemID, childLink.TargetWorkItemID, 
            childLink.WorkItemLinkTypeSK--,childLinkType.LinkName
FROM    dbo.FactWorkItemLinkHistory parentLink
        JOIN dbo.DimWorkItemLinkType parentLinkType (NOLOCK)
            ON parentLink.WorkItemLinkTypeSK = parentLinkType.WorkItemLinkTypeSK
        LEFT JOIN dbo.FactWorkItemLinkHistory childLink (NOLOCK)
            ON parentLink.TargetWorkItemID = childLink.SourceWorkItemID
            AND childLink.RemovedByPersonSK IS NULL
            AND childLink.WorkItemLinkTypeSK IN 
               (SELECT  sublink.WorkItemLinkTypeSK
                FROM    dbo.DimWorkItemLinkType sublink
                WHERE   sublink.LinkName = 'Child'
               )
        --LEFT JOIN dbo.DimWorkItemLinkType childLinkType (NOLOCK)
        --  ON childLink.WorkItemLinkTypeSK = childLinkType.WorkItemLinkTypeSK  
        --  AND childLinkType.LinkName = 'Child'            
WHERE   parentLink.SourceWorkItemID = 1917
        AND parentLink.RemovedByPersonSK IS NULL        
        AND parentLinkType.LinkName = 'Releases Story'

Я пытался заставить это работать безпредложение select в части from моего запроса, но оно все время ускользает от меня.

Результат, который я ищу, следующий:

1917    1915    1915    1916    2
1917    1913    1913    1914    2
1917    1913    1913    4349    2
1917    1921    1921    1922    2
1917    1918    NULL    NULL    NULL
1917    1920    NULL    NULL    NULL

Я получаю этот результатиспользуя select в предложении from, но я бы не стал использовать select там, если смогу избежать этого.

Я попытался внести следующие изменения:

  1. Раскомментируйте последнее соединение (и childLinkType.LinkName в главном предложении select)
  2. Удалите нежелательное предложение select (строка над последним соединением).

Когда я получаю это:

1917    1915    1915    1916    2   Child
1917    1915    1915    1917    20  NULL
1917    1915    1915    1919    7   NULL
1917    1915    1915    1911    4   NULL
1917    1913    1913    1914    2   Child
1917    1913    1913    1917    20  NULL
1917    1913    1913    1911    4   NULL
1917    1913    1913    4349    2   Child
1917    1921    1921    1922    2   Child
1917    1921    1921    1917    20  NULL
1917    1918    1918    1919    7   NULL
1917    1918    1918    1912    4   NULL
1917    1918    1918    1917    20  NULL
1917    1920    1920    1911    4   NULL
1917    1920    1920    1917    20  NULL

Это слишком много строк.И я не хочу совпадения значений NULL в таблице DimWorkItemLinkType.Поэтому я делаю последнее соединение внутренним соединением.Тогда я получаю это:

1917    1915    1915    1916    2   Child
1917    1913    1913    1914    2   Child
1917    1913    1913    4349    2   Child
1917    1921    1921    1922    2   Child

, который удалил элементы, у которых нет «потомков» (1918 и 1920 из первого набора данных).Я все еще нуждаюсь в них в своих результатах.

Любые идеи, как я могу удалить select (в предложении from) и все еще получить это, чтобы дать мне первый набор результатов?

ПРИМЕЧАНИЕ: Iя запускаю это для базы данных TFS_Warehouse на сервере TFS 2010 (используя таблицы, утвержденные для составления отчетов).

1 Ответ

1 голос
/ 10 марта 2011

Ну, я не буду притворяться, что я действительно понимаю ваш вопрос - как уже говорили другие, возможно, стоит попытаться разбить его и упростить - и у меня нет TFS_Warehouse, но я собираюсьрискнуть и догадаться, что вы ищете что-то вроде структуры (непроверенной, очевидно):

SELECT  parentLink.SourceWorkItemID, parentLink.TargetWorkItemID,
            childLink.SourceWorkItemID, childLink.TargetWorkItemID, 
            childLink.WorkItemLinkTypeSK--,childLinkType.LinkName
FROM    dbo.FactWorkItemLinkHistory parentLink
        JOIN dbo.DimWorkItemLinkType parentLinkType (NOLOCK)
            ON parentLink.WorkItemLinkTypeSK = parentLinkType.WorkItemLinkTypeSK
        LEFT JOIN 
          (dbo.FactWorkItemLinkHistory childLink (NOLOCK)
            INNER JOIN dbo.DimWorkItemLinkType childLinkType (NOLOCK)
              ON childLink.WorkItemLinkTypeSK = childLinkType.WorkItemLinkTypeSK  
              AND childLinkType.LinkName = 'Child')
          ON parentLink.TargetWorkItemID = childLink.SourceWorkItemID
          AND childLink.RemovedByPersonSK IS NULL
WHERE   parentLink.SourceWorkItemID = 1917
        AND parentLink.RemovedByPersonSK IS NULL        
        AND parentLinkType.LinkName = 'Releases Story'
...