树在SQL Server上查询

时间:2014-01-22 05:02:18

标签: sql sql-server tree recursive-query

我有一个查询连接4个表

SELECT
a.Id AS KelompokInformasi, d.Name AS Domain, d.Id AS Dimension, e.Text AS Description FROM XBRLNamespaces a
INNER JOIN Hypercubes b
ON a.XBRLView_ViewId = b.XBRLView_ViewId
INNER JOIN HypercubeDimensionItems c
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId
INNER JOIN Items d
ON c.XBRLItem_ItemId = d.ItemId
INNER JOIN Labels e
ON d.ItemId = e.XBRLItem_ItemId
WHERE a.Id like '%AAKX%'

查询结果为

KelompokInformasi   Domain  Dimension   Description
AAKX            JWAAKT  dim_JWAAKT  Jangka Waktu Aset
AAKX            KOKOLT  dim_KOKOLT  Kolektibilitas
AAKX            SNOUPL  dim_SNOUPL  Status Operasional Usaha Pihak Lawan

AAKX是域名,维度和说明中其他数据的父级。

所以,我想更改查询,最后有一个输出查询结果如下:

KelompokInformasi   Domain  Dimension   Description
AAKX            NULL    NULL        NULL
NULL            JWAAKT  dim_JWAAKT  Jangka Waktu Aset
NULL            KOKOLT  dim_KOKOLT  Kolektibilitas
NULL            SNOUPL  dim_SNOUPL  Status Operasional Usaha Pihak Lawan

3 个答案:

答案 0 :(得分:0)

我认为你必须使用Group by with cube并拥有。或分组。

http://technet.microsoft.com/en-us/library/bb522495(v=SQL.105).aspx

答案 1 :(得分:0)

SELECT
'KelompokInformasi' = 
  CASE
    WHEN a.Id like '%AAKX%' THEN a.Id
    ELSE NULL
  END, 
'Domain' =
  CASE
    WHEN a.Id like '%AAKX%' THEN NULL
    ELSE d.Name
  END, 
'Dimension' =
  CASE
    WHEN a.Id like '%AAKX%' THEN NULL
    ELSE d.Id
  END,
'Description' =
  CASE
    WHEN a.Id like '%AAKX%' THEN NULL
    ELSE e.Text
  END,
FROM XBRLNamespaces a
INNER JOIN Hypercubes b
ON a.XBRLView_ViewId = b.XBRLView_ViewId
INNER JOIN HypercubeDimensionItems c
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId
INNER JOIN Items d
ON c.XBRLItem_ItemId = d.ItemId
INNER JOIN Labels e
ON d.ItemId = e.XBRLItem_ItemId
WHERE a.Id like '%AAKX%'

答案 2 :(得分:0)

您可以使用上面使用的公用表表达式(CTE),ROW_NUMBER()和Same Case语句:

WITH cte AS
选择
a.Id AS KelompokInformasi,d。Name AS DOMAIN,d.Id AS Dimension,e.Text AS Description,
ROW_NUMBER()OVER(由a.Id ORDER by a.ID分区)AS COL5
FROM XBRLNamespaces a
INNER JOIN超立方体b
在a.XBRLView_ViewId = b.XBRLView_ViewId
INNER JOIN HypercubeDimensionItems c
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId
内部联接项目d
ON c.XBRLItem_ItemId = d.ItemId
INNER JOIN标签e
ON d.ItemId = e.XBRLItem_ItemId
在哪里...我喜欢'%AAKX%')
选择 CASE
         当COL5> 1那么空的时候KelompokInformasi结束为KelompokInformasi,
       的 CASE
         当COL5 = 1时,那么将ELSE DOMAIN结束为域,
       的 CASE
         当COL5 = 1 THEN NULL ELSE Dimension END AS尺寸,
       的 CASE
         当COL5 = 1 THEN NULL ELSE描述END AS描述
来自 cte