【发布时间】: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。
我尝试进行这些更改:
- 取消注释最后一个连接(以及主选择子句中的
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)。我的结果中仍然需要它们。
有什么想法可以删除选择(在 from 子句中)并仍然得到这个给我第一组结果吗?
注意:我针对 TFS 2010 服务器上的 TFS_Warehouse 数据库运行此程序(使用批准用于报告目的的表)。
【问题讨论】:
-
如果你一般地提出这个问题(就像你的标题所暗示的那样),而不是给我们一个关于细节的巨大问题,似乎你可能会得到更多的答案。似乎也没有人愿意解决这个问题。只是一个想法。 :-P
-
如果您只是想摆脱子查询,那么我建议您可以使用临时表并在其上运行联接。
-
我没有运行 TFS_Warehouse。您已经发布了输出但省略了输入。如果您发布给定输出的实际输入,更多人将能够为您提供帮助。
标签: sql sql-server sql-server-2008 join left-join