2012-01-05 54 views
1

我試圖在左外部聯接中獲得每個匹配(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 
+0

您正在使用的數據庫? MySQL的? MS SQL Server?甲骨文?每個提供處理這個要求的不同功能。 – 2012-01-05 22:15:11

+0

SQL Server 2005 – rymayes 2012-01-05 22:18:39

回答

0
Select A.STUDENT_ID  A.CONTACT_ID B.TYPE c.PHONE 
from TableA A 
inner join 
    (select MIN(type) as type, Contact_ID 
    from Tableb 
    where phone is not null 
    group by contactid) B 
on A.contactid = b.contactid 
inner join Tableb C 
on B.contactid = c.conatctid and b.type = c.type 
+0

謝謝!儘管每個聯繫人只給出一個電話號碼,但這似乎導致了STUDENT_ID,CONTACT_ID,PHONE_TYPE和PHONE都是相同的隨機重複。這可能是我如何調整上述查詢以適合我們的實際環境的結果。你介意看看我的查詢,看看我是否改變了一些不正確的東西? – rymayes 2012-01-06 14:38:54

+0

你可以試試嗎? \t SELECT * FROM TBL \t \t(選擇T1.STUDENT_ID, \t \t \t T1.CONTACT_ID, \t \t \t T2.PHONE_TYPE, \t \t \t T2.PHONE, \t \t \t ROW_NUMBER()以上(分區由T1.contactid命令由T2。PHONE_TYPE)作爲rowno \t \t \t FROM REG_STU_CONTACT T1 \t INNER JOIN EG_CONTACT_PHONE T2 \t上t1.contactid = t2.contactid \t WHERE PHONE IS NOT NULL \t)TBL \t其中tbl.rowno = 1 – Stefan 2012-01-06 21:10:19

+0

一點也沒有「T認識到 「任務型」 – rymayes 2012-01-06 21:20:36