Получить все данные из родительской записи как дочернюю запись - PullRequest
2 голосов
/ 13 марта 2012

У меня есть таблица, как показано ниже, которая имеет отношение между 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

Ответы [ 3 ]

2 голосов
/ 13 марта 2012

Как-то так может сработать

Тестовые данные

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, подробнее об этом здесь

Если у вас есть, например, еще одна строка в вашей таблице.Итак, ваша таблица выглядит следующим образом:

1   NULL    MyPrefix
2   1       NULL
3   2       NULL

Тогда результат будет по-прежнему таким:

1   NULL    MyPrefix
2   1       MyPrefix
3   2       MyPrefix

Поскольку я использую родительские дочерние отношения в таблице.

Если вы хотите иметь пример. Здесь , здесь , здесь и здесь - некоторые примеры использования stackoverflow

1 голос
/ 13 марта 2012

Попробуйте:

select S.RequestId, S.PrimaryRequestID, coalesce(P.Prefix, S.Prefix) As Prefix
from myTable P
right join myTable S on P.RequestID = S.PrimaryRequestID
0 голосов
/ 13 марта 2012
select   c.requestID, 
         c.primaryRequestID, 
         isnull(c.Prefix, p.Prefix)
from     table p, 
         table c
where    c.primaryRequestID   *= p.RequestID

Извинения за синтаксис архаичного объединения ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...