我正在尝试用一些奇特的连接来编写查询。我知道这可以做到,但我不记得怎么做了。
这是我现在的查询:
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
。
我尝试进行这些更改:
childLinkType.LinkName
)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)。我的结果中仍然需要它们。
任何想法如何删除select(在from子句中)并仍然得到这个给我第一组结果?
注意:我是针对TFS 2010服务器上的TFS_Warehouse数据库运行的(使用批准用于报告目的的表)。
答案 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'