2014-10-16 75 views
0

相当简单,我有3张表需要加入。 DB(MSSQL)应在前两个(p和u)表中有1个记录,然后在第3个表(a)中有多个记录。左连接3表返回右表中每场比赛的结果

我只希望它从第一个表中返回一个匹配(不是左外部联接?),而不管第二个表中是否存在匹配,但是如果存在匹配的显示,并且如果存在(大多数情况下,将有多个比赛),但只使用当列appt_date是有序的DESC的第一场比赛(给我最近的预约日期)比赛在第三表

SELECT p.person_id, p.ln, p.fn, p.sex, 
u.ud1_id, u.ud2_id, a.date, a.time 

FROM person p LEFT OUTER JOIN person_defined u 
ON p.person_id = u.person_id LEFT OUTER JOIN appointments a 
ON p.person_id = a.person_id 
where p.home_phone = '123456789' 
ORDER BY a.appt_date DESC 
+0

目前还不清楚你的查询有什么问题。是否因为预约关系的行重复?你遇到了什么错误的行为? – gustavodidomenico 2014-10-16 22:24:40

+0

你叫p和u第一个表,哪一个是“第一个”? p和u总会有一排吗? – DavidG 2014-10-16 22:25:30

+0

在你想要返回最近日期的任何列的select语句中使用'max(COLUMN)'。 – NonSecwitter 2014-10-16 22:28:55

回答

2

你可以利用的OUTER APPLY运营商在这里为每个人查找最近的约会。这比使用GROUP BYROW_NUMBER()运营商的组合要容易得多。

SELECT 
p.person_id, p.ln, p.fn, p.sex, 
u.ud1_id, u.ud2_id, 
pa.date, pa.time 
FROM person p 
LEFT OUTER JOIN person_defined u ON p.person_id = u.person_id 
OUTER APPLY 
(
    select top 1 a.date, a.time 
    from appointments a 
    where a.person_id = p.person_id 
    order by a.appt_date desc 
) pa 
where p.home_phone = '123456789'