显示来自连接查询的不同数据

时间:2012-10-24 13:41:31

标签: sql-server join distinct case

基本上我有2张桌子。让我们说A和B.

A包含id(PK),pin,name,address

等列
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的一个引脚的所有记录。

我正在尝试内连接,但由于表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

任何人都可以提供帮助:)

1 个答案:

答案 0 :(得分:4)

在SQL Server 2005+中,您可以使用row_number()来处理此类请求:

;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 with Demo

或没有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 with Demo