2011-03-10 38 views
1

我想用一些奇特的连接写一个查询。我知道这可以做到,但我不记得如何去做。将两张表重新连接在一起

这里是我的查询,因为它现在是:

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. 取消对最后一个加入(和主SELECT子句中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年),“儿童”的项目。我的结果仍然需要他们。

任何想法我可以删除选择(在从条款),仍然得到这个给我的第一组结果?

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

+1

好像如果你一般提出的问题(如你的标题所暗示的),你可能会得到更多的答案,而不是给我们一个具体的问题。似乎没有人想要解决这个问题。只是一个想法。 :-P – richard 2011-03-10 05:30:32

+0

如果你只是想摆脱子查询,那么我建议你可以使用临时表并在其上运行连接。 – pavanred 2011-03-10 06:22:18

+0

我没有运行TFS_Warehouse。您已发布输出,但省略了输入。如果您发布给定输出的实际投入,更多人将能够为您提供帮助。 – 2011-03-10 07:17:18

回答

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' 
+0

完美!工作完美!感谢您花时间回答我的问题! – Vaccano 2011-03-10 14:56:06