Sql 修改一个视图,我就卡住了
我正在修改一个视图,我被卡住了 我的用户有一个旧程序,它可以查询包含父/母数据的数据库视图。母亲和父亲的名字共享一个记录id,fname,lname,fname2,lname2,等等 我构建了一个新的数据库,表和相应的视图被更改为具有user\u id、parent\u id、fname和lname 家长共享一个用户id,但有单独的家长id 不管怎样,我正在尝试从用户_id,fname,lname返回到像id,fname,lname,fname2,lname2这样的结果,结果卡住了。我不确定从哪里开始,所以我得到了以下代码: 这是我从排除父id开始的: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这样的结果,结果卡住了。我不确定从哪
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:然后,用左连接替换第一个连接