2

名前用と電子メール用の2 つの正規化されたSQL Server 2008テーブルがあります。

create table Name (NameId int, Name varchar(50))
create table Email (NameId int, Email varchar(50))
go

insert into Name values (1, 'JOHN SMITH')
insert into Name values (2, 'MARY SMITH')
insert into Name values (3, 'PHILL TAYLOR')
go

insert into Email values (1, 'john@hotmail.com')
insert into Email values (1, 'john@gmail.com')
insert into Email values (1, 'john.smith@hotmail.com')
insert into Email values (2, 'mary@hotmail.com')
insert into Email values (3, 'phill@hotmail.com')
insert into Email values (3, 'phill@gmail.com')
insert into Email values (3, 'taylor.phill@hotmail.com')
insert into Email values (3, 'taylor.phill@gmail.com')
go

これらのテーブルを結合すると、いくつかの行があり、その行にはメールが 1 つだけ含まれています。

Select name, email
from Name inner join Email on name.NameId=email.NameId


NAME            EMAIL
-------------   --------------------------
JOHN SMITH      john@hotmail.com
JOHN SMITH      john@gmail.com
JOHN SMITH      john.smith@hotmail.com
MARY SMITH      mary@hotmail.com
PHILL TAYLOR    phill@hotmail.com
PHILL TAYLOR    phill@gmail.com
PHILL TAYLOR    taylor.phill@hotmail.com
PHILL TAYLOR    taylor.phill@gmail.com

しかし、定義済みのレイアウトを満たすために、すべてのメールを同じ行に配置する必要があります。

NAME            EMAIL1              EMAIL2          EMAIL3                      EMAIL4
-------------   -----------------   --------------- -----------------------     -----------------
JOHN SMITH      john@hotmail.com    john@gmail.com  john.smith@hotmail.com
MARY SMITH      mary@hotmail.com
PHILL TAYLOR    phill@hotmail.com   phill@gmail.com taylor.phill@hotmail.com    taylor.phill@hotmail.com

単一の選択を使用することは可能ですか?

どんなアイデアでも大歓迎です

ティア

リカルド・ノゲイラ

4

2 に答える 2

2

1選択でできます。最初の 4 つの電子メール アドレスのみが必要で、それらを特定の列として使用する場合。email テーブルで RowNumber 関数を使用して、ユーザーごとのメールアドレスに番号を付けます。この例では、電子メール アドレスをアルファベット順に並べ替える必要があると想定しています。

with m as (
  select 
    ROW_NUMBER() over (partition by nameId order by email) as Nr, 
    email.NameId, email.Email 
  from email
)
select 
  name.NameId, 
  name.Name, 
  m1.Email as Mail1,
  m2.Email as Mail2,
  m3.Email as Mail3,
  m4.Email as Mail4
from name
left join m m1 on (m1.Nr=1 and m1.NameId=name.NameId)
left join m m2 on (m2.Nr=2 and m2.NameId=name.NameId)
left join m m3 on (m3.Nr=3 and m3.NameId=name.NameId)
left join m m4 on (m4.Nr=4 and m4.NameId=name.NameId)
于 2013-11-09T20:44:08.570 に答える
0

きれいではなく、使用上の問題などがありますが、必要な場合は..必要があります..したがって、スキーマを使用すると、次のようになります:-

create function dbo.emails(@NameId int, @Ordinal int)
returns varchar(1024)
as begin
    declare @returnValue varchar(1024)
    select @returnValue=email
    from (
        select 
            ROW_NUMBER() over (order by e.Email) as ordinal,
            e.Email
        from Email e
        where e.NameId=@NameId
    ) p1 
    where p1.ordinal=@Ordinal
    return @returnValue
end
go
select e.Name,
    dbo.emails(n.NameId,1) as email1,
    dbo.emails(n.NameId,2) as email2,
    dbo.emails(n.NameId,3) as email3,
    dbo.emails(n.NameId,4) as email4
from Name n
go

生成:-

Name          email1                  email2             email3                  email4
JOHN SMITH    john.smith@hotmail.com  john@gmail.com     john@hotmail.com        NULL
MARY SMITH    mary@hotmail.com        NULL               NULL                    NULL
PHILL TAYLOR  phill@gmail.com         phill@hotmail.com  taylor.phill@gmail.com  taylor.phill@hotmail.com
于 2013-11-09T20:40:39.087 に答える