2014-10-16 16 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'