可以通过多个字段连接表吗?

时间:2010-11-01 20:47:20

标签: sql database join

情景就是这样。我们有一个包含所有逻辑客户信息的客户表,以及一个我们称之为“事件”的不同表。在事件表中,除了别的以外,还有客户端的名字,姓氏和ssn。

在customer表中,ssn是一个varchar(9),仅用于数字,但是事件表的ssn是varchar(11),用于数字加短划线。事情是一些客户可能是人或实体,而ssn用于区分这样的:

人们的ssn格式为123-45-6789,而实体的格式为12-3456789。

所以我想要做的是运行一个查询,该查询在名字和姓氏上连接Customer和Event表,以便我可以检查Event表格中SSN格式的差异。

我是一个相对较新的开发人员,所以我从来没有遇到过这种情况,也不知道是否有可能。这是我当前查询的样子:

SELECT top 10 c.firstname, c.lastname, c.ssn, e.ssn, e.firstname, e.lastname
FROM customer c with(nolock)
LEFT OUTER JOIN [event] e with(nolock) on 
c.firstname = e.firstname and
c.lastname = e.lastname

2 个答案:

答案 0 :(得分:2)

是的,您可以在ON子句条件中使用本机或用户定义的任何函数方式使用多个字段。它就像你在WHERE子句中使用的那样,但位于一个稍微不同的地方。例子:

FROM TABLE_A a
JOIN TABLE_B b ON b.col1 || ' ' || b.col2 = a.col

...或:

FROM TABLE_A a
JOIN TABLE_B b ON ABS(b.col) = a.col

过滤发生的地方是否重要?

WHEREON子句,使用INNER连接无关紧要。但是如果使用OUTER连接很重要,因为ON条件在JOIN之前/期间应用,而WHERE在之后发生 - 这可以彻底改变结果集。

答案 1 :(得分:0)

SELECT top 10 c.firstname, c.lastname, c.ssn, e.ssn, e.firstname, e.lastname 
FROM customer c with(nolock) 
JOIN [event] e with(nolock) on  
c.firstname = e.firstname and 
c.lastname = e.lastname

此查询有效,与原始查询相同,但左外部给出了偏差结果。