我試圖在左外部聯接中獲得每個匹配(CONTACT_ID)的單個結果(PHONE)。我想有一種方法可以通過其他列/字段(手機類型(TYPE))設置首選項(或順序)來完成此操作,但我一直無法弄清楚。下面是一些事實清單,有助於更好地解釋我正在努力完成的事情,然後是表A和B的示例,並獲得所需的結果。我看過min()和group by,但我不知道如何讓這些工作在這裏。作爲一個側面說明,在這個工作之後,我將以更簡單的方式將它加入到左邊的更多表格中。左外部每個匹配加入一個結果並匹配由匹配中不同字段設置的匹配「優先級」SQL Server 2005
- 學生可以有無限數量的CONTACT_ID。
- 聯繫人並不總是擁有所有的電話類型。
- 電話類型的優選順序(TYPE)是C,H,W(其中,幸運的是,恰好是按字母順序排列)
- 忽略匹配並轉至在優先級的下一個如果PHONE爲null
表A:
STUDENT_ID CONTACT_ID
---------- ----------
X 1
X 2
Y 3
Y 4
表B:
CONTACT_ID TYPE PHONE
---------- ---- -----
1 H 21
1 C
1 W 44
2 H 78
2 C 92
2 W 11
所需的結果:
STUDENT_ID CONTACT_ID TYPE PHONE
---------- ---------- ---- -----
X 1 H 21
X 2 C 92
Y 3
Y 4
這裏是我的,這將使所有的手機相匹配的連接(減去所有我在越來越瘋狂的嘗試我想要的)查詢。
SELECT *
FROM Table TableA T1
LEFT OUTER JOIN TableB T2 ON T1.CONTACT_ID = T2.CONTACT_ID
所有幫助非常感謝!
從斯特凡Onofrei的解決方案編輯的代碼:
(在一些重複的條目結果)
SELECT
T1.STUDENT_ID,
T1.CONTACT_ID,
T2.PHONE_TYPE,
T3.PHONE
FROM REG_STU_CONTACT T1
INNER JOIN
(SELECT MIN(PHONE_TYPE) AS PHONE_TYPE, CONTACT_ID
FROM REG_CONTACT_PHONE
WHERE PHONE IS NOT NULL
GROUP BY CONTACT_ID) T2 ON T1.CONTACT_ID = T2.CONTACT_ID
INNER JOIN REG_CONTACT_PHONE T3 ON T2.CONTACT_ID = T3.CONTACT_ID AND T2.PHONE_TYPE = T3.PHONE_TYPE
ORDER BY T1.STUDENT_ID
您正在使用的數據庫? MySQL的? MS SQL Server?甲骨文?每個提供處理這個要求的不同功能。 – 2012-01-05 22:15:11
SQL Server 2005 – rymayes 2012-01-05 22:18:39