2012-02-05 3 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」の2つの行がありますすべての '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を持つ2つの行をすべての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

いいえ、必ずしもそうではありません。時には1つしかない場合もあります。 – killerbunnyattack

+0

@killerbunnyattack:次に、最初の 'JOIN'を' LEFT JOIN'に置き換えます –

関連する問題