Sql 修改一个视图,我就卡住了

Sql 修改一个视图,我就卡住了,sql,sql-server,sql-server-2005,tsql,view,Sql,Sql Server,Sql Server 2005,Tsql,View,我正在修改一个视图,我被卡住了 我的用户有一个旧程序,它可以查询包含父/母数据的数据库视图。母亲和父亲的名字共享一个记录id,fname,lname,fname2,lname2,等等 我构建了一个新的数据库,表和相应的视图被更改为具有user\u id、parent\u id、fname和lname 家长共享一个用户id,但有单独的家长id 不管怎样,我正在尝试从用户_id,fname,lname返回到像id,fname,lname,fname2,lname2这样的结果,结果卡住了。我不确定从哪

我正在修改一个视图,我被卡住了

我的用户有一个旧程序,它可以查询包含父/母数据的数据库视图。母亲和父亲的名字共享一个记录id,fname,lname,fname2,lname2,等等

我构建了一个新的数据库,表和相应的视图被更改为具有user\u id、parent\u id、fname和lname

家长共享一个用户id,但有单独的家长id

不管怎样,我正在尝试从用户_id,fname,lname返回到像id,fname,lname,fname2,lname2这样的结果,结果卡住了。我不确定从哪里开始,所以我得到了以下代码:

这是我从排除父id开始的:

user_id     fname          lname         expiration
这就是我正在尝试并遇到的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
我觉得我很接近,但我也觉得我走错了路。有什么建议吗?

应该这样做:

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
这应该做到:

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

如果对于每个用户标识,始终有两行或最多两行具有相同的用户标识,则可以使用此连接或类似的连接:

    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

如果对于每个用户标识,始终有两行或最多两行具有相同的用户标识,则可以使用此连接或类似的连接:

    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

对于每个用户标识,是否总是有两行具有相同的用户标识?对于每个用户标识,是否总是有两行具有相同的用户标识?不,不总是。有时只有一个连接。@killerbunyattack:然后,用LEFT JOINNo替换第一个连接,但不总是这样。有时只有一个连接。@killerbunyattack:然后,用左连接替换第一个连接