【问题标题】:Joining two tables back on them selves together将两张桌子连接在一起
【发布时间】:2011-07-12 10:39:12
【问题描述】:

我正在尝试编写一个带有一些花哨连接的查询。我知道这可以做到,但我不记得该怎么做。

这是我现在的查询:

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'

我试图让它在我的查询的from 部分中没有select 子句的情况下运行,但它一直在逃避我。

我正在寻找的结果是这样的:

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

我在from 子句中使用select 得到该结果,但如果可以避免的话,我宁愿不在那里使用select

我尝试进行这些更改:

  1. 取消注释最后一个连接(以及主选择子句中的childLinkType.LinkName
  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

那行太多了。而且我不希望在 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)。我的结果中仍然需要它们。

有什么想法可以删除选择(在 from 子句中)并仍然得到这个给我第一组结果吗?

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

【问题讨论】:

  • 如果你一般地提出这个问题(就像你的标题所暗示的那样),而不是给我们一个关于细节的巨大问题,似乎你可能会得到更多的答案。似乎也没有人愿意解决这个问题。只是一个想法。 :-P
  • 如果您只是想摆脱子查询,那么我建议您可以使用临时表并在其上运行联接。
  • 我没有运行 TFS_Warehouse。您已经发布了输出但省略了输入。如果您发布给定输出的实际输入,更多人将能够为您提供帮助。

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


【解决方案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'

【讨论】:

  • 完美!工作完美!感谢您花时间回答我的问题!
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多