将两张桌子连接在一起自己

时间:2011-03-10 04:25:16

标签: sql sql-server sql-server-2008 join left-join

我正在尝试用一些奇特的连接来编写查询。我知道这可以做到,但我不记得怎么做了。

这是我现在的查询:

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
  2. 删除不需要的select子句(上一次连接上方的行)。
  3. 当我这样做时,我得到了这个:

    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
    

    这是太多行了。我不希望在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子句中)并仍然得到这个给我第一组结果?

    注意:我是针对TFS 2010服务器上的TFS_Warehouse数据库运行的(使用批准用于报告目的的表)。

1 个答案:

答案 0 :(得分:1)

好吧,我不会假装我真的理解你的问题 - 正如其他人所说,可能值得尝试分解并简化它 - 我没有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'