2012-01-05 59 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