2012-02-05 5 views
0

Я работаю над изменением вида, и я застрял.Изменение вида, и я застрял

У моего пользователя есть старая программа, которая запрашивает представление базы данных с родительскими (матери и отцом) данными. Имя матери и отца поделилось одной записью (id, fname, lname, fname2, lname2 и т. Д.).

Я построил новую базу данных, и таблица и соответствующее представление были изменены, чтобы иметь user_id, parent_id, fname и lname.

Родители делят user_id, но имеют отдельный parent_id.

В любом случае, я пытаюсь получить результаты от (user_id, fname, lname) до похожих (id, fname, lname, fname2, lname2) и застрял. Я не был уверен, с чего начать, так что я получил на следующий код:

Это то, что я начинаю с (за исключением parent_id):

user_id  fname   lname   expiration 

4   Jane   Doe   2015-01-01 00:00:00.000 
4   John   Doe   2015-01-01 00:00:00.000 
5   Bill   Smith   2015-01-01 00:00:00.000 
5   Mary   Smith   2015-01-01 00:00:00.000 

Это SQL я пытаюсь и застрял с:

SELECT ROW_NUMBER() OVER (PARTITION BY parents.user_id ORDER BY parents.user_id ASC) RowVersion , 
     dbo.parents.user_id , 
     fname , 
     lname , 
     '' AS fname2 , 
     '' AS lname2 , 
     ExpirationDate AS 'expiration' 
FROM  dbo.parents 
     INNER JOIN dbo.payment ON dbo.parents.user_id = dbo.payment.User_Id 
UNION 
SELECT ROW_NUMBER() OVER (PARTITION BY parents.user_id ORDER BY parents.user_id ASC) RowVersion , 
     dbo.parents.user_id , 
     '' AS fname , 
     '' AS lname , 
     fname AS fname2 , 
     lname AS lname2 , 
     ExpirationDate AS 'expiration' 
FROM  dbo.parents 
     INNER JOIN dbo.payment ON dbo.parents.user_id = dbo.payment.User_Id 
GROUP BY parents.user_id , 
     fname , 
     lname , 
     ExpirationDate 

Это результат вышеуказанного sql;

RowVersion user_id  fname   lname   fname2    lname2   expiration 
1   4          John    Doe    2015-01-01 00:00:00.000 
1   4   Jane   Doe            2015-01-01 00:00:00.000 
2   4          Jane    Doe    2015-01-01 00:00:00.000 
2   4   John   Doe            2015-01-01 00:00:00.000 
1   5          Bill    Smith   2015-01-01 00:00:00.000 
1   5   Mary   Smith           2015-01-01 00:00:00.000 
2   5          Mary    Smith   2015-01-01 00:00:00.000 
2   5   Bill   Smith           2015-01-01 00:00:00.000 

Это то, что мне нужно:

user_id  fname   lname   fname2    lname2   expiration 
4   Jane   Doe   John    Doe    2015-01-01 00:00:00.000 
5   Bill   Smith   Mary    Smith   2015-01-01 00:00:00.000 

Я чувствую, что я близко, но я чувствую, что я пошел по ложному пути. Какие-либо предложения?

+0

Есть ли всегда две строки с одинаковыми 'user_id' fo r каждый 'user_id'? –

ответ

4

Это должно сделать:

SELECT  
    ROW_NUMBER() OVER (PARTITION BY A.user_id ORDER BY A.user_id ASC) RowVersion , 
    A.user_id , 
    A.fname AS fname, 
    A.lname AS lname, 
    B.fname AS fname2 , 
    B.lname AS lname2 , 
    C.ExpirationDate AS 'expiration' 
FROM  
    dbo.parents A 
    INNER JOIN dbo.parents B ON A.user_id = B.user_id AND 
      A.ParentId > B.ParentId -- here you have to be careful fname and lname will be randomly male or female, if you provided other fields in parents table possibly there is a way to make it deterministic 
    INNER JOIN dbo.payment C ON A.user_id = C.user_id 
+0

Удивительный! Работает как шарм. – killerbunnyattack

1

Если всегда точно (или в лучшем случае) две строки с таким же user_id для каждого user_id, то вы могли бы использовать это или подобное присоединиться:

parents AS a 
JOIN        --- or LEFT JOIN 
    parents AS b 
    ON a.user_id = b.user_id 
    AND a.parentsId < b.parent_id --- a field that differentiates the two rows 

с запросом что-то вроде:

SELECT 
     a.user_id , 
    , a.fname AS fname, 
    , a.lname AS lname, 
    , b.fname AS fname2 , 
    , b.lname AS lname2 , 
    , ExpirationDate 
FROM 
     dbo.parents AS a 
    LEFT JOIN 
     dbo.parents AS b 
      ON a.user_id = b.user_id 
      AND a.parentsId < b.parent_id  
    JOIN 
     dbo.payment AS p 
      ON a.user_id = p.User_Id 
+0

Нет, не всегда. Иногда есть только один. – killerbunnyattack

+0

@killerbunnyattack: Затем замените первый 'JOIN' на' LEFT JOIN' –

Смежные вопросы