Изменение вида, и я застрял - PullRequest
0 голосов
/ 06 февраля 2012

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

У моего пользователя есть старая программа, которая запрашивает представление базы данных, в котором содержатся данные о родителях (матери и отце). Имена матери и отца разделяют одну запись (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

Мне кажется, что я рядом, но я чувствую, что пошла не по тому пути. Есть предложения?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

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

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
1 голос
/ 06 февраля 2012

Если там всегда ровно (или самое большее) две строки с одинаковым 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...