如何将第一个表中不存在的记录与内部联接子句中的第二个表中的记录匹配。例如,如果我是基于办公室号码的内部加入,但第二张表中不存在办公室号码 90,但最近的办公室是 91,那么我将如何“替换”或进行匹配?
如果 office='90' 那么在哪里('91')
如何将第一个表中不存在的记录与内部联接子句中的第二个表中的记录匹配。例如,如果我是基于办公室号码的内部加入,但第二张表中不存在办公室号码 90,但最近的办公室是 91,那么我将如何“替换”或进行匹配?
如果 office='90' 那么在哪里('91')
您会认为在列表中找到最接近的数字匹配项在 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
.
您需要创建一个单独的映射表并与之连接。像这样的东西:
OfficeNumberMap
- OfficeNumber
- SubstituteOfficeNumber
因此,在该表中,您将为每个映射到自身的“有效”办公室号码的条目,以及映射到替代的“无效”办公室号码的条目。
Office Number | SubstituteOfficeNumber
--------------+-----------------------
80 80 <- valid
81 81 <- valid
90 91 <- Invalid, so use 91 as alternate.