3

基本的に私は2つのテーブルを持っています。AとBとしましょう。

Aには、id(PK)、ピン、名前、アドレスなどの列があります

id(PK)  pin             name    address
1        aaa-111-aaa    AAA ------
2        bbb-222-bbb    BBB ------
3        ccc-333-ccc    CCC --------

B には、appName、apprequestTime、appAccectTime、id(FK) などの列があります。

appName apprequestTime  appAccectTime    id(FK).
LLL          2012-4-01  2012-4-01    1
NNN          2012-4-08  2012-5-01    2
QQQ          2012-4-05  2012-4-01    1
MMM          2012-4-02  2012-4-02    2
PPP          2012-5-01  2012-5-01    1

B テーブルは外部キーであるため、複数の id 行が存在する可能性があります。

さて、問題は、特定の apprequestTime の 1 つのピンのすべてのレコードを取得しようとしていることです。

内部結合を試みていますが、テーブル B の ID のためにピンが表示されます。

pin         apprequestTime
aaa-111-aaa     2012-4-01
aaa-111-aaa     2012-4-05
bbb-222-bbb     2012-4-08
bbb-222-bbb     2012-4-02

しかし、私が期待している結果は次のようになります。

pin            apprequestTime
aaa-111-aaa    2012-4-01
               2012-4-05
bbb-222-bbb    2012-4-08
               2012-4-02

誰でも助けることができます:)

4

1 に答える 1

4

row_number()SQL Server 2005+ では、このタイプの要求に使用できます。

;with cte as
(
  select a.pin, b.apprequestTime,
    row_number() over(partition by a.pin 
                      order by b.apprequestTime) rn
  from tablea a
  inner join tableb b
    on a.id = b.id
) 
select case when rn = 1 then pin else '' end pin, 
  apprequestTime
from cte;

デモで SQL Fiddle を参照してください

または CTE なし:

select case when rn = 1 then pin else '' end pin, 
  apprequestTime
from 
(
  select a.pin, b.apprequestTime,
    row_number() over(partition by a.pin 
                      order by b.apprequestTime) rn
  from tablea a
  inner join tableb b
    on a.id = b.id
) t1

デモで SQL Fiddle を参照してください

于 2012-10-24T13:56:05.160 に答える