0

ヘルプ!これは、私が達成する必要があることの非常に単純な a,b,c サンプルです。私は髪を引っ張ってきました。これは以前にも書いたことがありますが、今は理解できません。実際の結果と予想される結果を以下に示します。

set nocount on
declare @a table (id int, a varchar(10))
declare @b table (ref int, b varchar(10), c varchar(20))


insert into @a select 1, 'bingo'
insert into @a select 2, 'bongo'


insert into @b select 1, 'T5', 'asdfwef'
insert into @b select 1, 'T8', 'asfqwez'
insert into @b select 1, 'T6', 'qweoae'
insert into @b select 1, 'T8', 'qzoeqe'
insert into @b select 1, 'T9', 'oqeizef'
insert into @b select 2, 'T3', 'awega'
insert into @b select 2, 'T6', 'fhaeaw'
insert into @b select 2, 'T3', 'fqsegw'


select * from @a a join @b b on a.id = b.ref

-- Expected  (Uniqueness is: a’s id to b’s ref and the first b value ingoring b’s c value)
----1,bingo,1,T5,asdfwef
----1,bingo,1,T8,asfqwez
----1,bingo,1,T6,qweoae
----1,bingo,1,T9,oqeizef
----2,bongo,2,T3,awega
----2,bongo,2,T6,fhaeaw

-- Actual
----1,bingo,1,T5,asdfwef
----1,bingo,1,T8,asfqwez
----1,bingo,1,T6,qweoae
----1,bingo,1,T8,qzoeqe
----1,bingo,1,T9,oqeizef
----2,bongo,2,T3,awega
----2,bongo,2,T6,fhaeaw
----2,bongo,2,T3,fqsegw
4

1 に答える 1

1

クエリは正しい結果を返しています。からのすべての一致する値@b

最初の b 値が必要な場合は、2 つのことを行う必要があります。最初に、「最初」とは何かを理解できるように、b に順序列を含める必要があります。SQL テーブルは順不同です。かんたんだよ:

declare @b table (id int identity(1,1) not null, ref int, b varchar(10), c varchar(20));

次に、id 以外のすべてを挿入するように挿入を変更する必要があります。

insert into @b(ref, b, c) select 1, 'T5', 'asdfwef';

これで、実際のクエリの準備が整いました。

select *
from @a a join
     (select b.*, row_number() over (partition by b.ref, b.b order by b.id) as seqnum
      from @b b 
     ) b
     on a.id = b.ref and b.seqnum = 1
于 2013-03-29T23:06:21.560 に答える