将第一个表中不存在的记录与第二个表内连接相匹配

时间:2012-12-26 20:22:50

标签: sql

如何将第一个表中不存在的记录与内部连接子句的第二个表中的记录进行匹配。例如,如果我是基于办公室号码的内部加入,但第二个表中不存在办公室号码90,但是最近的办公室是91,那么我将如何'替换'或进行匹配?

if office = '90'然后在办公室('91')

2 个答案:

答案 0 :(得分:0)

您需要创建一个单独的映射表并与之连接。像这样:

OfficeNumberMap
  - OfficeNumber
  - SubstituteOfficeNumber

因此,在该表中,您将拥有映射到自身的每个“有效”办公室编号的条目,以及映射到替代的“无效”办公室编号的条目。

Office Number | SubstituteOfficeNumber
--------------+-----------------------
            80                      80  <- valid
            81                      81  <- valid
            90                      91  <- Invalid, so use 91 as alternate.

答案 1 :(得分:0)

您会认为在列表中找到最接近的数字匹配将是在SQL中容易表达的内容。有一种方法,虽然确切的语法因数据库而异:

select ft.officenumber,
       (select OfficeNumber from SecondTable st order by abs(ft.OfficeNumber - st.OfficeNumber limit 1
       ) as MyBestGuess
from FirstTable ft

这样做是使用相关子查询来查看第二个表。它按差值的绝对值排序所有结果,然后选择第一个值。

一对评论。在我能想到的任何SQL引擎中,这将需要对FirstTable的每一行进行SecondTable的全表扫描。翻译:它很慢,随着数据量的增加,速度会慢得多。

其次,这仅适用于数值。我不知道“关闭”对于字符串意味着什么。

第三,limit是获取第一行输出的常用语法。它适用于大多数数据库。在SQL Server中,您将使用select top 1,在Oracle中,您将使用where rownum = 1