我试图在左外部联接中获得每个匹配(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