【问题标题】:Get all data from parent record as the child record从父记录中获取所有数据作为子记录
【发布时间】:2012-03-13 20:41:40
【问题描述】:

我有一个如下表,它在 requestID 和 PrimaryRequestID 之间有关系:

RequestID   PrimaryRequestID    Prefix  
-----------------------------------------------------------
1           NULL            MyPrefix
2           1               NULL

我想做的是加入这个,所以我得到以下输出:

1   NULL    MyPrefix
2   1       MyPrefix

我已经尝试了几次连接,但最终还是得到了一个 NULL 前缀。

编辑:这可能与我得到的一样接近:

SELECT  
    ra.RequestID 
    ,CASE WHEN rb.Prefix IS NULL THEN ra.Prefix ELSE ra.Prefix END AS Prefix
FROM requests ra
LEFT  JOIN requests rb on ra.RequestID = rb.PrimaryRequestID

【问题讨论】:

  • 你试过什么?展示你的工作很有帮助,因为你可能只需要在你已经完成的工作上朝着正确的方向前进。

标签: sql sql-server-2005 tsql


【解决方案1】:

这样的事情可能会奏效

测试数据

DECLARE @tbl TABLE (RequestID INT,PrimaryRequestID INT,Prefix VARCHAR(100))

INSERT INTO @tbl
VALUES
    (1,NULL,'MyPrefix'),
    (2,1,NULL)

查询

;WITH CTE(RequestID,PrimaryRequestID,Prefix)
AS
(
    SELECT
        tbl.RequestID,
        tbl.PrimaryRequestID,
        tbl.Prefix
    FROM
        @tbl AS tbl
    WHERE
        tbl.PrimaryRequestID IS NULL
    UNION ALL
    SELECT
        tbl.RequestID,
        tbl.PrimaryRequestID,
        CTE.Prefix
    FROM
        @tbl AS tbl
        JOIN CTE
            ON tbl.PrimaryRequestID=CTE.RequestID
)
SELECT
    *
FROM
    CTE

我正在使用递归 cte 函数阅读更多关于它的信息here

例如,如果您的表格中还有一行。所以你的表是这样的:

1   NULL    MyPrefix
2   1       NULL
3   2       NULL

那么输出还是这样的:

1   NULL    MyPrefix
2   1       MyPrefix
3   2       MyPrefix

因为我在表中使用了父子关系。

如果你想举一些例子。 Herehereherehere 是 stackoverflow 上的一些示例

【讨论】:

  • 您要从内部加入 CTE?我从来没有见过这样做的。
  • 没问题.. 是的。当表中有父子关系时,此函数非常有用。
  • 是的,我从你的代码中学到了一些东西,我会读到,但我担心 Mark Ba​​nnister 会被标记为答案,因为必须以简单为准:) 谢谢你的时间。
【解决方案2】:

试试:

select S.RequestId, S.PrimaryRequestID, coalesce(P.Prefix, S.Prefix) As Prefix
from myTable P
right join myTable S on P.RequestID = S.PrimaryRequestID

【讨论】:

  • 子记录的 requestID 为 NULL
  • (修正错别字)不使用 right 连接 - 您会在 Primary 请求记录上获得 NULL 作为 PrimaryRequestID,如您所需的输出所示。
【解决方案3】:
select   c.requestID, 
         c.primaryRequestID, 
         isnull(c.Prefix, p.Prefix)
from     table p, 
         table c
where    c.primaryRequestID   *= p.RequestID

为过时的连接语法道歉......

【讨论】:

  • 这与选择的答案相同,只是您没有按照应有的方式使用外连接(coalesce 和 isnull 做同样的事情,除了 coalesce 可以采用更多参数)
  • 语法对 oracle 有效,对 mssql 无效
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2020-06-06
  • 2013-04-08
相关资源
最近更新 更多